Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android JNI找不到第三方庫的解決方案 cannot load library

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

編輯:關於Android編程

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

 

 

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

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved