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
我不明白這個錯誤。 有沒有人可以幫助我? 預先感謝您
你能否確認'callback()'方法和'Java_com_example_hellojni1_nativeJava_testDirectCallback'在同一個類中?而且,'Java_com_example_hellojni1_nativeJava_testDirectCallback'被聲明爲「native」而不是「static native」?我發現第二個參數是'jclass'而不是'jobject' ...如果它實際上是一個'jclass',那麼'GetObjectClass'將返回一個對'java.lang.Class'的引用。 – fadden
與你的問題沒有關係,但是......要安全地緩存方法,請參閱Android的標準JNI [advice](http://developer.android.com/training/articles/perf-jni.html)。 –
你很厲害!我花了好幾天。非常感謝!! – user2642459