2012-04-28 22 views
5

我必須使用兩個本地庫:一個是我自己的,另一個是第三方。只要我在不同的項目中使用它們,一切都很好。但現在我得到Exception Ljava/lang/UnsatisfiedLinkErrorAndroid中的多個(我和第三方)本地庫NDK

我正在使用Eclipse。

我發現如果將現有庫放在libs/armeabi中,Eclipse開始編譯本機代碼,並且它失敗。如果我從命令行重建JNI部分,編譯成功,但第三方庫消失。真是愚蠢。

那麼,我該如何告訴Eclipse使用現有的.so庫以及必須構建的庫?這些庫是獨立的。

回答

7

NDK允許使用PREBUILT_SHARED_LIBRARY變量與預建的用戶庫進行鏈接。

假設你需要鏈接庫是librandom.so,在jni子文件夾的項目文件夾中創建一個文件夾libs

mkdir -p jni/libs 
cp librandom.so jni/libs 

然後,只需創建一個jni/libs/Android.mk文件:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := random 
LOCAL_SRC_FILES := librandom.so 
include $(PREBUILT_SHARED_LIBRARY) 

您可以爲每個預建庫創建一個部分,全部放置在jni/libs中。

接下來,您只需將上述文件包含到您的jni/Android.mk中即可使用。在NDK的文檔,建議本在Android.mk年底完成,而不是中間:

include $(LOCAL_PATH)/libs/Android.mk 

但是,你需要的是需要這個庫中的模塊之前做到這一點。

對於鏈接,您需要將以下內容添加到鏈接到預建庫的模塊部分。

LOCAL_SHARED_LIBRARIES := random 

然後當你做NDK建造,它將這個庫複製到libs/armeabi/構建模塊之前,你是好去。

注意:這並不能解決所需標題的問題。您仍然需要將庫標題的位置添加到需要它的模塊中的變量LOCAL_C_INCLUDES

+0

更新:如果一個庫依賴於另一個庫,請參閱http://stackoverflow.com/questions/17688327/android-ndk-make-two-native-shared-libraries-calling-each-other – 18446744073709551615 2014-04-18 08:16:06

3

這就是我現在所做的。我不會接受(在stackoverflow意義上)我自己的(這個)答案,因爲它不令人滿意。

我創建了一個新項目並將所有java文件複製到那裏。然後,我將舊項目和第三方庫中的.so庫複製到libs/armeabi中。

這太可怕了。但它的工作。目前來看。最糟糕的情況是版本控制被魚雷攻擊。