标签:
最近做一个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的mk如下:
1
2
3
4
5
6
7
8
9
|
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := bb LOCAL_SRC_FILES := libbb.so include $(PREBUILT_SHARED_LIBRARY) |
3.libaa.so的mk文件需要引入上面的mk。
1
2
3
4
5
6
7
8
9
10
11
|
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := aa LOCAL_SRC_FILES := aa.cpp LOCAL_LDLIBS := -llog LOCAL_SHARED_LIBRARIES := bb include $(BUILD_SHARED_LIBRARY) include $(LOCAL_PATH)/prebuilt/Android.mk |
这样在编译阶段就可以连接到第三方库咯。
2.运行阶段找不到库
在运行阶段找不到库就是Android的事情了。后来发现是load库的顺序(默哀一个,破顺序。。)。
1
2
3
4
5
|
static { System.loadLibrary(bb); System.loadLibrary(aa); } |
先load第三方库,再load自己的库,因为aa库要用bb库里的方法,是依赖于bb库的,所以要先load。。
这样在运行阶段也可以找到库咯。
标签:
原文地址:http://www.cnblogs.com/awebing/p/5078316.html