为什么" x86"库安装在" armeabi-v7a"模拟器而不是" armeabi-v7a"图书馆?

时间:2016-07-20 09:47:25

标签: android android-ndk java-native-interface abi android-ffmpeg

为了介绍我的问题,我有一个使用NDK的应用程序仅编译为" armeabi-v7a"和" x86" ABI的。所以汇编给了我:

Android NDK: WARNING: APP_PLATFORM android-17 is larger than android:minSdkVersion 10 in /home/**********/AndroidManifest.xml
[armeabi-v7a] Gdbserver      : [arm-linux-androideabi-4.9] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup       : libs/armeabi-v7a/gdb.setup
[x86] Gdbserver      : [x86-4.9] libs/x86/gdbserver
[x86] Gdbsetup       : libs/x86/gdb.setup
[armeabi-v7a] Install        : libNativeFFMPEG.so => libs/armeabi-v7a/libNativeFFMPEG.so
[armeabi-v7a] Install        : libavcodec-56.so => libs/armeabi-v7a/libavcodec-56.so
[armeabi-v7a] Install        : libavutil-54.so => libs/armeabi-v7a/libavutil-54.so
[armeabi-v7a] Install        : libswscale-3.so => libs/armeabi-v7a/libswscale-3.so
[x86] Install        : libNativeFFMPEG.so => libs/x86/libNativeFFMPEG.so
[x86] Install        : libavcodec-57.so => libs/x86/libavcodec-57.so
[x86] Install        : libavutil-55.so => libs/x86/libavutil-55.so
[x86] Install        : libswscale-4.so => libs/x86/libswscale-4.so

这个警告可能表明了我的问题? (这与两个目标ABI上的ffmpeg库版本不同,但我不认为这是问题)

然后,我使用 CPU / ABI =(ARM)armeabi-v7a 创建一个模拟器,并且在应用程序启动时未加载我的lib(但是使用" x86"基于设备," x86" lib已加载并正常工作)。当我用shell探索它(模拟器)时,我可以看到:

lrwxrwxrwx install 2016-07-20 10:06 lib -> /data/app/com.**********/lib/x86

仅限" x86"安装了lib ...请解释一下?

(我在三星Galaxy S3上测试时遇到同样的问题,CPU应该是 ARM Cortex-A9 ,这个CPU实现了ARMv7-A架构。但我的库也找不到.. 。)

&安培;&安培;&安培;&安培;&安培;&安培;&安培;&安培;&安培;&安培;&安培;&安培;&安培;&安培;在某些操作之后我在ANDROID.MK&&&&&&&&&&&&&&&&

中修复了错误

如果您对我在调用 System.loadLibrary()时生成的异常感兴趣,请执行以下操作:

07-20 12:31:23.360: D/dalvikvm(3671): Trying to load lib /data/app-lib/com.**********/libNativeFFMPEG.so 0x40cdc118
07-20 12:31:23.370: W/System.err(3671): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libswscale-3.so" needed by "libNativeFFMPEG.so"; caused by load_library(linker.cpp:745): library "libswscale-3.so" not found
07-20 12:31:23.370: W/System.err(3671):     at java.lang.Runtime.loadLibrary(Runtime.java:371)
...

但是当我查看/data/app-lib/com.**********时,我发现了我的" armeabi-v7a"库!!

root@android:/data/app-lib/com.********** # ls
gdbserver
libNativeFFMPEG.so
libavcodec-56.so
libavutil-54.so
libswscale-3.so

但它仍然是例外! 当我尝试加载swscale像 System.loadLibrary(" swscale-3"); 我有以下异常:

07-20 12:56:36.351: E/dalvikvm(4174): dlopen("/data/app-lib/com.**********/libswscale-3.so") failed: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libavutil-54.so" needed by "libswscale-3.so"; caused by load_library(linker.cpp:745): library "libavutil-54.so" not found
07-20 12:56:36.361: W/System.err(4174): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libavutil-54.so" needed by "libswscale-3.so"; caused by load_library(linker.cpp:745): library "libavutil-54.so" not found
07-20 12:56:36.361: W/System.err(4174): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libavutil-54.so" needed by "libswscale-3.so"; caused by load_library(linker.cpp:745): library "libavutil-54.so" not found

当我尝试加载 avutil-54 时,我有" NativeFFMPEG" (但是使用libavutil-54.so)

1 个答案:

答案 0 :(得分:1)

最后用@ user1056837的帮助解决了我的问题。

我需要搜索的奇怪的事情是:

对于ABI“x86”(至少?),当你想使用依赖于其他库的libmylib.so时,你只需要加载libmylib.so:

System.loadLibrary("mylib");

但对于ABI“armeabi-v7a”(至少?),你必须手动加载你的lib,lib的依赖关系,以及你的lib依赖的依赖...

System.loadLibrary("dep1");
System.loadLibrary("dep2");
System.loadLibrary("mylib");

我现在还没有明确的解释,但我会找到它。我希望它可以帮助别人。

编辑:问题不在于目标arch,而在于我的本机代码/库编译。