2012-06-24 21 views
-1

我做了什麼至今是:重用在一個新的項目生成的.so共享庫的Android

把我的JNI文件夾老LIB(libold.so),並創建一個Android.mk,具有:

LOCAL_PATH :=$(call my-dir) 

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

之後,我運行了ndk-build,它創建了一個libold.so文件夾/ libs/armeabi。

看起來很好,但是當我運行它時可以找到我調用的方法。解決方法是更改​​名稱包,與以前使用的名稱包相同。

我在做什麼錯?

+0

NDK庫中的本地方法實現都包含Java包名稱(如'Java_com_myapp_MyClass_MyMethod()')。確保在新項目中,包裝Java類位於相同的包(例如,「com.myapp」)中。 –

回答

0

您不能直接在New Project中使用已編譯的庫。對於不同的軟件包名稱,c文件中相應的函數簽名將會改變。

JNIEXPORT jint JNICALL Java_com_package_class(JNIEnv *d, jobject e, jstring f) { 
//inside function 

    } 

您需要包含類的jar包,在您遵守所謂文件的項目,要調用本地函數中,以使其對新項目進入這樣的文件。

+0

不工作...... – user1477414

1

本地.so中的JNI_OnLoad例程爲其解析的方法設置了特定的Java包名稱。如果在類(或多個類)上使用不同的包名稱,則解析本機方法時,VM將找不到正確的方法,除非您的JNI_OnLoad知道如何區分差異並正確註冊其本機。

你如何糾正這將取決於你如何着手註冊本地人,但它可能(即使有點複雜)讓你的註冊過程確定負載正在完成和註冊方法。

+0

我不知道如何註冊bcz不是我多麼瘋狂的圖書館。但是,我想更改軟件包名稱並使用不同的名稱... – user1477414

+1

如果您沒有源代碼來重新生成庫,則必須爲需要庫的類使用相同的Java軟件包名稱。只要使用本地方法的一個類保持與.so一致的包名稱,您仍然可以使用不同的APK包名稱。 – mah

+0

SO,沒有改變使用android.mk預編譯? :s – user1477414

相關問題