Android jni 找不到第三方库

来源:互联网 发布:关于网络的短句 编辑:程序博客网 时间:2024/06/05 17:41

最近做一个jni项目,拿到的so库需要用jni封装一层,等于是在jni的C++代码里调用第三方库的方法,然后整个项目在Android上运行出结果。

自己用jni生成的so是libaa.so 使用的第三方库是libbb.so。

到目前为止,遇到的问题是libbb各种找不到。libbb库去哪儿了?

 

E/AndroidRuntime(11626): Caused by: Java.lang.UnsatisfiedLinkError:

Cannot load library: soinfo_link_image(linker.cpp:1640):
could not load library libbb.so needed by libaa.so;

caused by load_library(linker.cpp:750): library libbb.so not found

 

以上错误是在运行阶段发生的,事实上编译阶段也发生过找不到第三方的问题,表现就是库里实现的方法undefined。

分两方面解决

 

1,编译阶段找不到库,需要修改MK文件。

1.libbb.so放在jni/prebuilt文件夹(自己新建),同时把Android.mk复制一份到prebuilt下。

2.libbb.so的Android.mk如下:

 

[java] view plain copy
  1. <span style="color:#FF0000">LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. <strong>LOCAL_MODULE := bb</strong>  
  6.   
  7. LOCAL_SRC_FILES := libbb.so  
  8.   
  9. <strong>include $(PREBUILT_SHARED_LIBRARY)</strong></span>  

 

3.libaa.so的android.mk文件需要引入上面的android.mk。

 

[java] view plain copy
  1. <span style="color:#FF0000">LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE    := aa  
  6. LOCAL_SRC_FILES := aa.cpp  
  7. LOCAL_LDLIBS := -llog  
  8.   
  9. <strong>LOCAL_SHARED_LIBRARIES := bb</strong>  
  10. include $(BUILD_SHARED_LIBRARY)  
  11. <strong>include $(LOCAL_PATH)/prebuilt/Android.mk</strong></span>  

 

这样在编译阶段就可以连接到第三方库咯。

 注意:prebuilt目录得放在libaaa/jni/下,即libaaa/jni/prebuilt


2.APK 运行阶段找不到库

 

在运行阶段找不到库就是Android的事情了。后来发现是load库的顺序(默哀一个,破顺序。。)。

 

[java] view plain copy
  1. static   
  2.     {  
  3.         System.loadLibrary(bb);  
  4.         System.loadLibrary(aa);  
  5.     }  
先load第三方库,再load自己的库,因为aa库要用bb库里的方法,是依赖于bb库的,所以要先load。。

 

 

这样在运行阶段也可以找到库咯。


3.elf文件运行阶段找不到库

现象

root@generic:/data/local/tmp # ./testload
./testload
CANNOT LINK EXECUTABLE: could not load library "libktest.so" needed by "./testlo
ad"; caused by library "libktest.so" not found


处理方式

1|root@generic:/data/local/tmp # LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp
RARY_PATH:/data/local/tmp                                                     <
root@generic:/data/local/tmp # ./testload
./testload


0 0