2013-08-01 66 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声明“本机”,而不是“静土”。

这是我的问题。