0

我已经使用 android ndk 独立工具链成功地将c++ 库交叉编译到了 android 平台。我已经使用 jni dolder 和 Android.mk 文件在 Eclipse 中创建了一个新的 android 应用程序项目,当我执行 ndk-build 时,构建进展顺利,并将 mylib.so 添加到 libs/armeabi 文件夹问题是当我执行System.loadLibrary("mylibname"); 我在 logcat 中收到以下错误:无法 dlopen(/data/data/com.oussama.firsttry/lib/libdash.so):无法加载库:link_image [1995]:无法链接 libdash.so 导致java .lang.UnsatisfiedLinkError: my lib not found**

必须有一个库,我的 lib 依赖并且模拟器无法加载它,所以我已经完成了readelf -d mylib.so,结果如下:

偏移 0x1617c4 处的动态部分包含 26 个条目:

 Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libm.so]
0x00000001 (NEEDED)                     Shared library: [libc.so]
0x00000001 (NEEDED)                     Shared library: [libdl.so]
0x0000000e (SONAME)                     Library soname: [libdash.so]
0x00000010 (SYMBOLIC)                   0x0
0x0000000f (RPATH)                      Library rpath:      [/home/oussama064/libdash/libdash/../../neededLibs]
0x00000019 (INIT_ARRAY)                 0x157268
0x0000001b (INIT_ARRAYSZ)               172 (bytes)
0x0000001a (FINI_ARRAY)                 0x157314
0x0000001c (FINI_ARRAYSZ)               8 (bytes)
0x00000004 (HASH)                       0xf4
0x00000005 (STRTAB)                     0x10f58
0x00000006 (SYMTAB)                     0x50b8
0x0000000a (STRSZ)                      134112 (bytes)
0x0000000b (SYMENT)                     16 (bytes)
0x00000003 (PLTGOT)                     0x1618b4
0x00000002 (PLTRELSZ)                   1096 (bytes)
0x00000014 (PLTREL)                     REL
0x00000017 (JMPREL)                     0x40dd8
0x00000011 (REL)                        0x31b38
0x00000012 (RELSZ)                      62112 (bytes)
0x00000013 (RELENT)                     8 (bytes)
0x00000018 (BIND_NOW)                   
0x6ffffffb (FLAGS_1)                    Flags: NOW
0x6ffffffa (RELCOUNT)                   7738
0x00000000 (NULL)                       0x0

这是我的 Android.mk 文件:

 LOCAL_PATH := $(call my-dir)

 include $(CLEAR_VARS) LOCAL_MODULE    := libcurl  LOCAL_SRC_FILES :=
 ../../../../neededLibs/libcurl.a

 include $(PREBUILT_STATIC_LIBRARY)

 include $(CLEAR_VARS) LOCAL_MODULE    := libxml  LOCAL_SRC_FILES :=
 ../../../../neededLibs/libxml2.a

 include $(PREBUILT_STATIC_LIBRARY)

 include $(CLEAR_VARS) LOCAL_MODULE    := libz  LOCAL_SRC_FILES :=
 ../../../../neededLibs/libz.a

 include $(PREBUILT_STATIC_LIBRARY)

 include $(CLEAR_VARS) LOCAL_MODULE    := m  LOCAL_SRC_FILES :=
 libm.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
 LOCAL_MODULE    := dl  LOCAL_SRC_FILES := libdl.so

 include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE
 := c  LOCAL_SRC_FILES := libc.so

 include $(PREBUILT_SHARED_LIBRARY)

 include $(CLEAR_VARS)

 LOCAL_MODULE := d LOCAL_SRC_FILES := libdash.so
 LOCAL_SHARED_LIBRARIES := c m dl 

 LOCAL_STATIC_LIBRARIES := libz libxml libcurl  include
 $(PREBUILT_SHARED_LIBRARY)

我现在真的被卡住了,我无法弄清楚丢失的图书馆是什么

当我执行 ndk-build V=1 -B 时,我得到以下结果:

rm -f /home/oussama064/Android/workspace/FirstTry/libs/armeabi/lib*.so   

所以依赖性下降了。make: 循环 obj/local/armeabi/libm.so <- obj/local/armeabi/libc.so 依赖被删除。make: 循环 obj/local/armeabi/libdl.so <- obj/local/armeabi/libm.so 依赖被删除。make: 循环 obj/local/armeabi/libdl.so <- obj/local/armeabi/libc.so 依赖被删除。make: 循环 obj/local/armeabi/libdl.so <- obj/local/armeabi/libdl.so 依赖被删除。预建:libdl.so <= /home/oussama064/Android/workspace/FirstTry/jni/ cp -f /home/oussama064/Android/workspace/FirstTry/jni/libdl.so 循环 obj/local/armeabi/libdl.so <- obj/local/armeabi/libc.so 依赖被删除。make: 循环 obj/local/armeabi/libdl.so <- obj/local/armeabi/libdl.so 依赖被删除。预建:libdl.so <= /home/oussama064/Android/workspace/FirstTry/jni/ cp -f /home/oussama064/Android/workspace/FirstTry/jni/libdl.so 循环 obj/local/armeabi/libdl.so <- obj/local/armeabi/libc.so 依赖被删除。make: 循环 obj/local/armeabi/libdl.so <- obj/local/armeabi/libdl.so 依赖被删除。预建:libdl.so <= /home/oussama064/Android/workspace/FirstTry/jni/ cp -f /home/oussama064/Android/workspace/FirstTry/jni/libdl.so
obj/local/armeabi/libdl.so 预建:libm.so <= /home/oussama064/Android/workspace/FirstTry/jni/ cp -f /home/oussama064/Android/workspace/FirstTry/jni/libm.so obj/ local/armeabi/libm.so 制作:循环 obj/local/armeabi/libc.so <- obj/local/armeabi/libc.so 依赖项已删除。预建:libc.so <= /home/oussama064/Android/workspace/FirstTry/jni/ cp -f /home/oussama064/Android/workspace/FirstTry/jni/libc.so obj/local/armeabi/libc.so 安装: libc.so => /home/oussama064/Android/workspace/FirstTry/libs/armeabi/libc.so install -p ./obj/local/armeabi/libc.so
/home/oussama064/Android/workspace/FirstTry/libs/ armeabi/libc.so /home/oussama064/NDK/android-ndk-r8d/toolchains/arm-linux-androideabi- 4.
/home/oussama064/Android/workspace/FirstTry/libs/armeabi/libc.so 预建:libxml2.a <=
/home/oussama064/Android/workspace/FirstTry/jni/../../../../ requiredLibs/ cp -f
/home/oussama064/Android/workspace/FirstTry/jni/../../../../neededLibs/libxml2.a obj/local/armeabi/libxml2.a 预建:libcurl.a < = /home/oussama064/Android/workspace/FirstTry/jni/../../../../neededLibs/ cp -f /home/oussama064/Android/workspace/FirstTry/jni/../../ ../../neededLibs/libcurl.a
obj/local/armeabi/libcurl.a 预建:libdash.so <= /home/oussama064/Android/workspace/FirstTry/jni/

cp -f /home/oussama064/Android/workspace/FirstTry/jni/libdash.so      
obj/local/armeabi/libdash.so
Install        : libdash.so =>   
/home/oussama064/Android/workspace/FirstTry/libs/armeabi/libdash.so
install -p ./obj/local/armeabi/libdash.so    
 /home/oussama064/Android/workspace/FirstTry/libs/armeabi/libdash.so
/home/oussama064/NDK/android-ndk-r8d/toolchains/arm-linux-androideabi-
4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-strip --strip-unneeded  
/home/oussama064/Android/workspace/FirstTry/libs/armeabi/libdash.so
Install        : libdl.so => 
/home/oussama064/Android/workspace/FirstTry/libs/armeabi/libdl.so

install -p ./obj/local/armeabi/libdl.so 

/home/oussama064/Android/workspace/FirstTry/libs/armeabi/libdl.so
/home/oussama064/NDK/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm -linux-androideabi-strip --strip-不需要

/home/oussama064/Android/workspace/FirstTry/libs/armeabi/libdl.so
Install        : libm.so =>   
/home/oussama064/Android/workspace/FirstTry/libs/armeabi/libm.so
install -p ./obj/local/armeabi/libm.so
/home/oussama064/Android/workspace/FirstTry/libs/armeabi/libm.so
/home/oussama064/NDK/android-ndk-r8d/toolchains/arm-linux-androideabi-     

4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-strip --strip-unneeded    

/home/oussama064/Android/workspace/FirstTry/libs/armeabi/libm.so

如果有人可以帮助我,我将不胜感激。

4

1 回答 1

0

您应该使用系统版本的 libm、libc 和 libdl 共享库,

LOCAL_LDLIBS := -lm -ldl 

如果不能,请静态链接它们。

于 2016-04-10T16:46:14.973 回答