Android JNI找不到第三方庫的解決方案 cannot load library
阿新 • • 發佈:2019-02-19
最近做一個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如下:
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。
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庫的順序(默哀一個,破順序。。)。
static
{
System.loadLibrary("bb");
System.loadLibrary("aa");
}
先load第三方庫,再load自己的庫,因為aa庫要用bb庫裡的方法,是依賴於bb庫的,所以要先load。。
這樣在執行階段也可以找到庫咯。