2016-07-20 18 views
0

为了介绍我的问题,我有一个应用程序只使用NDK编译为“armeabi-v7a”和“x86”ABI。所以汇编给我:为什么“x86”库安装在“armeabi-v7a”仿真器上而不是“armeabi-v7a”库中?

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被加载并工作),lib不会被加载。当我探索它(模拟器)与壳,我可以看到:

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

只有“x86”lib安装...请解释?

(我有同样的问题在三星Galaxy S3的测试,该CPU应该是的ARM Cortex-A9这个CPU实现的ARMv7-A架构。但我的库没有发现任何...)

& & & & & & & & & & & & & &一些MANIP后,我FIX误差的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”库!

[email protected]:/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)的相同的异常

+0

你最终的apk文件里面有什么?你有** x86 **和** armeabi-v7a **目录和必要的库吗?如果没有 - 在java模块中查看ABI过滤器。 – user1056837

+0

是的,我已经在生成的.apk文件中使用@ user1056837 – N0un

+0

我可以建议在应用程序启动时使用java函数'System.loadLibrary()'并捕获它的异常。在异常消息中会有信息,系统试图找到你的库。它可能是有用的。 – user1056837

回答

1

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

奇怪的事情,我需要寻找的是认为:

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

System.loadLibrary("mylib"); 

但对于ABI “armeabi-V7A”(至少?),你必须手动加载的lib,你的lib的依赖,和你的lib的依赖的依赖......

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

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

编辑:问题不是关于目标拱,而是关于我的本地代码/库编译。

相关问题