1. 程式人生 > >Android JNI找不到第三方庫的解決方案 cannot load library

Android JNI找不到第三方庫的解決方案 cannot load library

最近做一個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。。

這樣在執行階段也可以找到庫咯。