2013-12-19 118 views
2

我有一個名爲com.example.remote在包我有JNI本地方法沒有找到

public native static void send_feedback(String feedback); 

static { 
    System.loadLibrary("com_example_remote_Remote"); 
} 

然後在我的com_example_remote_Remote.c文件我得到這個方法的Remote.java文件包:

JNIEXPORT void JNICALL Java_com_example_remote_Remote_send_feedback(JNIEnv *env, jclass clazz, jstring feedback) 

全部編譯。但是,當我做了調用Java函數的程序停止工作,並給了我:

12-19 12:21:31.183: E/AndroidRuntime(3196): FATAL EXCEPTION: main 
12-19 12:21:31.183: E/AndroidRuntime(3196): java.lang.UnsatisfiedLinkError: Native method not found: com.example.remote.Remote.send_feedback:(Ljava/lang/String;)V 
12-19 12:21:31.183: E/AndroidRuntime(3196):  at com.example.remote.Remote.send_feedback(Native Method) 

我想我的語法是符合JNI的規則。一旦我認爲它可以解決問題,我刪除了obj地圖。我重建項目,仍然給我那個錯誤。

編輯:

改名爲sendFeedback,現在我得到這個錯誤:

12-19 12:49:26.335: A/libc(3280): Fatal signal 11 (SIGSEGV) at 0x00000cd0 (code=0), thread 3280 (.example.remote) 
+0

在libs/ABINAME文件夾(其中ABINAME是fx armabi,x86,...)中是否有libcom_example_remote_Remote.so?你是否使用intel CPU/ABI模擬器?如果是的話,你也必須將你的本地庫編譯爲x86, – Selvin

+0

從你的函數名刪除下劃線或用'_1'轉義它。 – eozgonul

+0

我在armeabi文件夾中有一個.so文件。我正在用nexus來測試這個。 – user1480139

回答

1

在本地方法定義添加extern "C"。即

extern "C" JNIEXPORT void JNICALL Java_com_example_remote_Remote_send_feedback(JNIEnv *env, jclass clazz, jstring feedback){.......} 

或者

如果在聲明和定義(在Java文件和.c文件)可能改變方法名,因爲_可能在方法名的問題。即

public native static void sendFeedback(String feedback); 


extern "C" JNIEXPORT void JNICALL Java_com_example_remote_Remote_sendFeedback(JNIEnv *env, jclass clazz, jstring feedback) 
{ 
.... 
} 

你會發現一個樣品here

+0

我已經改名爲sendFeedback,現在應用程序只是關閉此錯誤消息:12-19 12:49:26.335:A/libc(3280):致命信號11(SIGSEGV)在0x00000cd0(代碼= 0),線程3280(.example.remote)。我還有一個.h文件需要重新創建嗎? – user1480139

+0

@ user1480139可能在方法體的代碼中存在一些錯誤。修復,然後重新編譯它。它會再次在'obj - > armeabi'文件夾中生成一個.so文件。 –

+0

顯然,即使認爲它已經編譯,函數體內仍然有一個錯誤。謝謝。但是是否有必要重新創建標題?我嘗試在bin/classes文件夾中使用javah -jni ClassName,但是javah總是抱怨「可能找不到類文件...」 – user1480139

0

我已經更名爲sendFeedback所以它是不帶下劃線。此外,該方法中有一個錯誤,這個答案無關緊要。