无法从JNI GetMethodId函数中获取值[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法从JNI GetMethodId函数中获取值[关闭]相关的知识,希望对你有一定的参考价值。

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

我的.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
", str);
    if(str) {
        //return (env)->NewStringUTF("Open Success");
        return str;
    }
}

我在按钮单击活动端访问此本机功能

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

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

答案

字段类型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

以上是关于无法从JNI GetMethodId函数中获取值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Android jni GetFieldID 和 GetMethodID 函数的说明

JNI中java类型的简写

使用挂起异常java.lang.ClassNotFoundException调用JNI GetMethodID

从本机 c 代码 (JNI) 为 Java 中的回调函数传递多个参数

Android Studio NDK开发-JNI调用Java方法

在 JNI 中传递对象总是返回 NULL