Android ndk 如何将java类实例作为参数传递给JNI方法?

Android ndk 如何将java类实例作为参数传递给JNI方法?,android-ndk,Android Ndk,我想把java类对象传递给JNI方法, 我想在JNI方法中调用几个方法,如下所示 有没有人有下面这样的例子 class JavaClassParameter{ void javaMethodTobeCalledInJNI(){ ...java source... } } class MainJavaClass{ void somemethod(){ JavaClassParameter object = new JavaClassPara

我想把java类对象传递给JNI方法, 我想在JNI方法中调用几个方法,如下所示

有没有人有下面这样的例子

class JavaClassParameter{
    void javaMethodTobeCalledInJNI(){
        ...java source...
    }
}

class MainJavaClass{
    void somemethod(){
        JavaClassParameter object = new JavaClassParameter();
        JNIMethod(object);
    }

    native void JNIMethod(JavaClassParameter object);
}


// C++ code
void JNIMethod(object){
    object->javaMethodTobeCalledInJNI();
}

您的方法声明:

class MainJavaClass {
    native void JNIMethod(JavaClassParameter object);
}
方法应生成如下所示的转发声明:

JNIEXPORT void JNICALL Java_MainJavaClass_JNIMethod(JNIEnv* env, jobject mainJavaClass);
在实施过程中,您需要做几件事:

查找JavaClassParameter 使用
FindClass
,它采用字符串名称:

jclass cls = env->FindClass("JavaClassParameter");
查找javaMethodTobeCalledInJNI() 使用
GetMethodID
,它将检查类、方法的字符串名称及其签名。因为这是一个没有参数的void函数,所以它只是
()V

调用javaMethodTobeCalledInJNI() 使用
CallVoidMethod
,它获取对象实例、方法ID和任何参数(本例中无):



您应该在每个步骤后检查空结果;如果从一个JNI函数返回NULL并将其传递给另一个函数,通常会使JVM崩溃

如果要将类对象传递给JNI方法,则可以像传递任何其他对象一样传递它。上面的代码似乎是传递类而不是类的实例,所以我不确定这与您的问题有什么关系。如果javaMethodTobeCalledInJNI()是绑定到JavaClassParameter类的静态方法,这可能会起作用。在这种情况下,它不能使用实例字段变量。该问题特别指出,对象将作为实例参数传递给JNIMethod。否则不能使用实例字段。由于JNIMethod是mainJavaClass的一种方法,因此Java_mainJavaClass_JNIMethod似乎需要三个参数:env、mainJavaClass隐式参数和显式jobject JavaClassParameter_instanceObj。否?在这里,您使用javaMethodTobeCalledInJNI定义方法ID,它位于JavaClassParameter类下面,但是您使用mainJavaClass的实例调用它。我不明白。
jmethodID method = env->GetMethodID(cls, "javaMethodTobeCalledInJNI", "()V");
env->CallVoidMethod(mainJavaClass, method);