【问题标题】:Why "x86" library is installed on a "armeabi-v7a" emulator instead of "armeabi-v7a" library?为什么在“armeabi-v7a”模拟器上安装“x86”库而不是“armeabi-v7a”库?
【发布时间】:2016-11-23 11:40:49
【问题描述】:

为了介绍我的问题,我有一个使用 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 创建了一个模拟器,并且在应用程序启动时我的库没有加载(但使用基于“x86”的设备“x86” lib 已加载并可以正常工作)。当我用 shell 探索它(模拟器)时,我可以看到:

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

只安装了“x86”库...请解释一下?

(我在三星 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

但它仍然是例外! 当我尝试像 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)

【问题讨论】:

  • 你最终的 apk 文件里面有什么?您是否同时拥有 x86armeabi-v7a 目录以及必要的库?如果没有 - 查看 java 模块中的 ABI 过滤器。
  • 是的,我在生成的 .apk 中都有,@user1056837 中有库
  • 我可以建议在应用程序启动时使用 java 函数System.loadLibrary() 并捕获它的异常。在异常消息中会有信息,系统试图找到您的图书馆。它可能很有用。
  • 我相信,它应该打印目录列表,但它找不到库。然后下一个问题。您的 apk 文件中是否只有两个带有本机库的目录(即 x86、armeabi-v7a)?你的loadLibrary 序列是否正确(我相信它是正确的,但在 x86 上可能存在一些奇怪的行为;我的意思是 swscale 在 ffmpeg 之前加载)?
  • 好的,我更新我的帖子(再次...)。我的模拟器中有正确的“armeabi-v7a”库,但 loadLibrary 仍然失败。我只是这样称呼它(被“try/catch”包围)System.loadLibrary("NativeFFMPEG");

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


【解决方案1】:

终于在@user1056837的帮助下解决了我的问题。

我需要搜索的是:

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

System.loadLibrary("mylib");

但是对于 ABI “armeabi-v7a”(至少?),您必须手动加载您的库、您的库的依赖项以及您的库的依赖项的依赖项...

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

我暂时没有明确的解释,但我会找到的。我希望它可以帮助某人。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2019-11-11
    • 2011-09-09
    • 2012-08-26
    • 2023-03-28
    • 2019-11-25
    • 2014-12-08
    相关资源
    最近更新 更多