我已经使用NDK
编译了FFmpeg
库,并使用它在我的应用程序中修剪视频和获取视频缩略图,所以基本上我已经启动并运行了ffmpeg.so
和video-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