2013-08-01 65 views
1

我想在JNI/NDK中實現一個回調函數。 我的GetMethodID功能得到了錯誤GetMethodID在Android上失敗jni

我想執行Java中(從C)的函數具有以下特徵:

[java代碼]

public int callback(String msg) { 
    cb_tv.setText(msg); 
    return 1; 
} 

[本地C代碼]

JNIEXPORT void JNICALL Java_com_example_hellojni1_nativeJava_testDirectCallback(JNIEnv *env, jclass obj) { 
    static jmethodID cb = NULL; 
    jclass cls = (*env)->GetObjectClass(env, obj); 

    if(cb == NULL) { 
     cb = (*env)->GetMethodID(env, cls, "callback", "(Ljava/lang/String;)I"); 
    if(cb == NULL) return; 
    } 
    (*env)->CallVoidMethod(env, obj, cb, (*env)->NewStringUTF(env, "[C->J] callback")); 

    return; 
} 

我得到以下錯誤:

08-01 16:26:43.617: W/dalvikvm(516): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
08-01 16:26:43.637: E/AndroidRuntime(516): FATAL EXCEPTION: main 
08-01 16:26:43.637: E/AndroidRuntime(516): java.lang.NoSuchMethodError: callback 

我不明白這個錯誤。 有沒有人可以幫助我? 預先感謝您

+1

你能否確認'callback()'方法和'Java_com_example_hellojni1_nativeJava_testDirectCallback'在同一個類中?而且,'Java_com_example_hellojni1_nativeJava_testDirectCallback'被聲明爲「native」而不是「static native」?我發現第二個參數是'jclass'而不是'jobject' ...如果它實際上是一個'jclass',那麼'GetObjectClass'將返回一個對'java.lang.Class'的引用。 – fadden

+0

與你的問題沒有關係,但是......要安全地緩存方法,請參閱Android的標準JNI [advice](http://developer.android.com/training/articles/perf-jni.html)。 –

+0

你很厲害!我花了好幾天。非常感謝!! – user2642459

回答

4

像法登...文件檔案

檢查您的Java_com_example_hellojni1_nativeJava_testDirectCallback聲明「本機」,而不是「靜土」。

這是我的問題。