为什么 "x86" 库安装在 "armeabi-v7a" 模拟器上而不是 "armeabi-v7a" 库?
Why "x86" library is installed on a "armeabi-v7a" emulator instead of "armeabi-v7a" library?
为了介绍我的问题,我有一个使用仅针对 "armeabi-v7a" 和 "x86" ABI 编译的 NDK 的应用程序。所以编译给了我:
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 创建了一个模拟器,当应用程序启动时我的库没有加载(但是有一个 "x86" 基于设备,"x86" 库已加载并工作)。当我使用 shell 探索它(模拟器)时,我可以看到:
lrwxrwxrwx install 2016-07-20 10:06 lib -> /data/app/com.**********/lib/x86
只安装了 "x86" 库...请解释一下?
(我在三星 Galaxy S3 上测试时遇到同样的问题,CPU 应该是 ARM Cortex-A9 而这个 CPU 实现了 ARMv7 -A架构。但是我的图书馆也没有找到...)
&&&&&&&&&&&&& 在一些 MANIP 之后我修复了 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
但还是例外!
当我尝试像 System.loadLibrary("swscale-3"); 这样加载 swscale 时,我遇到了以下异常:
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)
终于在@user1056837 的帮助下解决了我的问题。
奇怪的是我需要搜索的是:
对于 ABI "x86"(至少?),当您想使用依赖于其他库的 libmylib.so 时,您只需加载 libmylib.so:
System.loadLibrary("mylib");
但是对于 ABI "armeabi-v7a"(至少?),您必须手动加载您的库、您的库的依赖项以及您的库的依赖项的依赖项...
System.loadLibrary("dep1");
System.loadLibrary("dep2");
System.loadLibrary("mylib");
目前还没有明确的解释,我会找到的。我希望它可以帮助某人。
编辑:问题不在于目标架构,而在于我的原生 code/libraries 编译。
为了介绍我的问题,我有一个使用仅针对 "armeabi-v7a" 和 "x86" ABI 编译的 NDK 的应用程序。所以编译给了我:
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 创建了一个模拟器,当应用程序启动时我的库没有加载(但是有一个 "x86" 基于设备,"x86" 库已加载并工作)。当我使用 shell 探索它(模拟器)时,我可以看到:
lrwxrwxrwx install 2016-07-20 10:06 lib -> /data/app/com.**********/lib/x86
只安装了 "x86" 库...请解释一下?
(我在三星 Galaxy S3 上测试时遇到同样的问题,CPU 应该是 ARM Cortex-A9 而这个 CPU 实现了 ARMv7 -A架构。但是我的图书馆也没有找到...)
&&&&&&&&&&&&& 在一些 MANIP 之后我修复了 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
但还是例外! 当我尝试像 System.loadLibrary("swscale-3"); 这样加载 swscale 时,我遇到了以下异常:
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)
终于在@user1056837 的帮助下解决了我的问题。
奇怪的是我需要搜索的是:
对于 ABI "x86"(至少?),当您想使用依赖于其他库的 libmylib.so 时,您只需加载 libmylib.so:
System.loadLibrary("mylib");
但是对于 ABI "armeabi-v7a"(至少?),您必须手动加载您的库、您的库的依赖项以及您的库的依赖项的依赖项...
System.loadLibrary("dep1");
System.loadLibrary("dep2");
System.loadLibrary("mylib");
目前还没有明确的解释,我会找到的。我希望它可以帮助某人。
编辑:问题不在于目标架构,而在于我的原生 code/libraries 编译。