无法从 JNI GetMethodId 函数获取值

Unable to get value from JNI GetMethodId function

我无法调用 .cpp 文件中的 java 方法。 JNI 函数 GetMethodID returns 空值。

我的 .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;
    }
}

我正在 activity 侧

的按钮单击中访问此本机功能
public void onClick(View v) {
    // connectedState(connect);
    boolean b= getJniString();
}

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

字段类型Ljava/lang/String;错误,因为Java方法接受Zboolean.

  • 一个(Z)意味着它接受一个boolean参数。

  • 另一个Z意味着它有一个booleanreturn值。

大概是这样的:

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

并且您必须在 return 之前将(最终)returned boolean 转换为 (jboolean)

参见 Chapter 4. The class File Format,低于 "field descriptors"。