2

我已经编译了FFmpeg库,NDK并使用它来修剪视频并从我的应用程序中的视频中获取缩略图,所以基本上我已经启动ffmpeg.sovideo-trimmer.so运行了库。

然而问题很奇怪,trim 或 getThumbnail 操作成功但只有一次,即第一次,第二次操作失败。但是第三次​​成功了,我用谷歌搜索了两个与我的问题相关的类似帖子

帖子 1:

帖子 2:

有趣的是,他们提出了相同的解决方案,而我无法解决C编程语言幼稚的问题。

这是我所做的

void Java_com_example_demo_natives_LibraryLoader_loadTrimmerLibrary(JNIEnv* env, jclass class, jstring libffmpeg_path, jstring inputFile, jstring outFile,
        jstring startTime, jstring length)
{
        const char* path;
        void* handle;
        int *(*Java_com_example_demo_natives_VideoTrimmer_trim)(JNIEnv *, jclass, jstring, jstring, jstring, jstring);

        path = (*env)->GetStringUTFChars(env, libffmpeg_path, 0);

        handle = dlopen(path, RTLD_LAZY);

        Java_com_example_demo_natives_VideoTrimmer_trim = dlsym(handle, "Java_com_example_demo_natives_VideoTrimmer_trim");
        (*Java_com_example_demo_natives_VideoTrimmer_trim)(env, class, inputFile, outFile, startTime, length);

        (*env)->ReleaseStringUTFChars(env, libffmpeg_path, path);

        dlclose(handle);
}

尽管调用dlclose库实例仍然存在于内存中,但我在这里做错了什么?

我知道库实例仍然存在,因为当我在其他活动中再次加载库时,错误消息显示库已经存在于 CL 中。

我想从内存中删除该库的实例,请帮助...

4

1 回答 1

0

尝试移动“ReleaseString...”的位置

它应该在“dlopen”之后

它应该在调用其他共享库之前...

(*env)->GetStringUTFChars
dlopen
(*env)->ReleaseStringUTFChars
make the main call
dlclose
于 2012-09-06T17:24:01.627 回答