无法从JNI GetMethodId函数获取值

时间:2019-04-24 07:30:36

标签: android java-native-interface

我无法在.cpp文件中调用Java方法。 JNI函数GetMethodID返回空值。

我的.java文件:

public boolean connectedState(boolean status) {
    return status;
}

我的.cpp文件:

extern "C"
JNIEXPORT jboolean
JNICALL Java_com_android_myapplication_MainActivity_getJniString( JNIEnv* env, jobject obj){

    jstring jstr = (env)->NewStringUTF("This comes from jni.");
    jclass cls=(env)->GetObjectClass(obj);
    jclass clazz = (env)->FindClass("com/android/myapplication/MainActivity");
    jmethodID connectionState = env->GetMethodID(clazz, "connectedState","(Ljava/lang/String;)Z");
    jobject result = (env)->CallObjectMethod( obj, connectionState, true);

    const jboolean str = (env)->GetBooleanField(result, NULL); // should be released but what a heck, it's a tutorial :)
    // printf("%s\n", str);
    if(str) {
        //return (env)->NewStringUTF("Open Success");
        return str;
    }
}

我正在通过活动侧的按钮单击访问此本机功能

public void onClick(View v) {
    // connectedState(connect);
    boolean b= getJniString();
}

我在getJniString()的本机方法中的connectionState变量中获取空值。

1 个答案:

答案 0 :(得分:3)

字段类型Ljava/lang/String;是错误的,因为Java方法接受Z boolean

  • 一个(Z)表示它接受一个boolean参数。

  • 另外一个Z表示它具有一个boolean返回值。

可能有点像这样:

jclass cls = env->FindClass("com/android/myapplication/MainActivity");
jmethodID mid = env->GetMethodID(cls, "connectedState", "(Z)Z");
jobject result = env->CallObjectMethod(cls, mid, true);

您必须将(最终)返回的boolean强制转换为(jboolean),然后再返回。

请参见“字段描述符”下方的Chapter 4. The class File Format