使用dlclose(Android NDK)从应用程序中删除本机库的实例



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

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

帖子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中已经存在库。

我想从内存中删除那个库的实例,请帮忙。。。

尝试移动"ReleaseString…"的位置

它应该在"dlopen"之后

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

(*env)->GetStringUTFChars
dlopen
(*env)->ReleaseStringUTFChars
make the main call
dlclose

相关内容

  • 没有找到相关文章

最新更新