【发布时间】:2017-10-24 06:26:59
【问题描述】:
我已经使用 NDK v15.2 编译了 ffmpeg v3.4,并且正在创建一个名为 ffmpeg-jni 的包装器库。
static {
try {
System.loadLibrary("avutil");
System.loadLibrary("avcodec");
System.loadLibrary("avformat");
System.loadLibrary("swscale");
System.loadLibrary("avfilter");
System.loadLibrary("ffmpeg-jni"); // Exception here line#101
loadedLibraries = true;
} catch (Throwable e) {
e.printStackTrace();
}
}
下面是加载我的包装库时抛出的异常。
10-24 11:12:13.819 21499-21499/com.myeglu.android.canary.staging W/System.err: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "av_register_all" referenced by "/data/app/com.myeglu.android.canary.staging-2/lib/arm/libffmpeg-jni.so"...
但是,令我惊讶的是,这个函数是在 libavformat.so 中定义的,它加载成功;从nm tool output可以清楚地看出,av_register_all() 函数是在 libavformat.so 中定义的 (T)
这里是所有在运行时难以实现和平的预构建库的链接。 (除了 ffmpeg 库之外,还有一些其他库)
https://drive.google.com/drive/folders/0B20ExoMyOP_UeDhNdmwzc2tjR3M?usp=sharing
有人帮助我了解在这种情况下我可能会丢失什么。感谢您的宝贵时间。
【问题讨论】:
-
如果库不在您项目的正确文件夹中,它将不会链接它们。例如:app/jniLibs/armeabi-v7a 并且你的 gradle 脚本需要引用它们,你没有在这里显示。
-
库被正确地塞进了 apk,目前只有一个变种 armeabi。在运行时,它也能够正确加载它们。加载所有其他依赖库后出现异常。
-
您的 av-lib 属于 armeabi-v7a,而不是 armeabi。因此,如果您为 armeabi 构建 libffmpeg-jni.so,这可能会导致加载 lib 时出现问题。
标签: android c++ ffmpeg android-ndk