Android本机运行时无法加载符号,即使它们实际上是在加载的.so文件中找到的
Android native runtime fails to load symbols even though they are actually found in the loaded .so files
我已经使用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工具输出中可以清楚地看出,av_register_all()函数是在libavformat.so 中定义的(T)
以下是所有预先构建的库的链接,这些库在运行时很难实现和平。(除了ffmpeg库之外,还有一些其他库)
https://drive.google.com/drive/folders/0B20ExoMyOP_UeDhNdmwzc2tjR3M?usp=sharing
有人帮我了解在这种情况下我可能会错过什么。谢谢你抽出时间。
首先,您应该以正确的顺序显式列出所有需要的库,或者让系统解析依赖关系(如果您的平台至少是Lollipop)。
具体来说,libavcodec需要libswresample。
但是ffmpeg jni似乎没有正确构建。其动态部分仅列出
0x00000001 (NEEDED) Shared library: [libandroid.so]
0x00000001 (NEEDED) Shared library: [libjnigraphics.so]
0x00000001 (NEEDED) Shared library: [libavcodec.so]
0x00000001 (NEEDED) Shared library: [liblog.so]
0x00000001 (NEEDED) Shared library: [libc.so]
此外,.dynsym表包含
5: 00000000 0 NOTYPE GLOBAL DEFAULT UND av_register_all
相反,我希望
5: 00000000 0 FUNC GLOBAL DEFAULT UND av_register_all@LIBAVFORMAT_57 (4)
请注意,avcodec_find_decoder的符号类型以及来自libavcodec的其他引用。因此库中的是正确的。
您是否可以将LOCAL_ALLOW_UNDEFINED_SYMBOLS=true
用于libffmpeg jni.so?
更新:实际上,cmake使用Android工具链准备的CMAKE_SHARED_LINKER_FLAGS
将--no-undefined
传递给链接器;通过覆盖这个变量,您有效地允许了未定义的符号(并丢失了一些其他为Android调整的重要标志)。底线是,重写CMAKE标准变量是危险的。
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 使用 SDL2 和SDL_image C++加载图像
- 无法使用加载库卸载注入的 dll (C++)
- 是否有原子加载非原子值的函数?
- 将 bmp 文件加载到 TSpeedButton 中
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- Android本机运行时无法加载符号,即使它们实际上是在加载的.so文件中找到的