2011-09-15 21 views
0

我正在開發一個使用JNI的Android應用程序。UnsatisfiedLinkError問題

命令javah -jni com.company.tests.MainRenderer給了我這樣的輸出:

/* 
* Class:  com_company_tests_MainRenderer 
* Method: nativeInit 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java_com_company_tests_MainRenderer_nativeInit 
    (JNIEnv *, jclass); 

/* 
* Class:  com_company_tests_MainRenderer 
* Method: nativeRender 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java_com_company_tests_MainRenderer_nativeRender 
    (JNIEnv *, jclass); 

命令nm -Ca libRotateJNI.so給了我這樣的輸出:

00001c25 T Java_com_company_tests_MainRenderer_nativeInit(_JNIEnv*, _jclass*) 
00001c29 T Java_com_company_tests_MainRenderer_nativeRender(_JNIEnv*, _jclass*) 

這是如何定義這些函數:

void Java_com_company_tests_MainRenderer_nativeInit(JNIEnv* env, jobject thiz) 
{ 
    // ... 
} 

void Java_com_company_tests_MainRenderer_nativeRender(JNIEnv* env, jobject thiz) 
{ 
    // ... 
} 

而且運行它與此消息:

WARN/dalvikvm(639): No implementation found for native Lcom/company/tests/MainRenderer;.nativeInit()V 

我確定庫已加載。你知道我該如何解決這個問題?

回答

4

我懷疑你用C++編譯器編譯你的本地方法,並沒有給他們聯繫extern "C"。您提供給nm-C選項將C++名稱去除,但實際上,這些符號的名稱與JVM所尋找的名稱不同,因爲代碼是使用C++鏈接編譯的。將你的C++代碼放在一個extern "C"塊中,這應該可以解決問題。

0

我不知道你的MainRenderer是什麼,你打什麼機庫,但我的C文件功能始終是這個樣子:

void Java_com_ndkfoo_NDKFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) { 

的方法/類我打電話是NDKFooActivity及其調用原生功能...