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

时间:2010-12-17 06:28:30

标签: android-ndk

我想将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();
}

1 个答案:

答案 0 :(得分:15)

您的方法声明:

class MainJavaClass {
    native void JNIMethod(JavaClassParameter object);
}

表示javah应生成如下的前向声明:

JNIEXPORT void JNICALL Java_MainJavaClass_JNIMethod(JNIEnv* env, jobject mainJavaClass);

在实施中,你有几件事要做:

查找JavaClassParameter

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

jclass cls = env->FindClass("JavaClassParameter");

查找javaMethodTobeCalledInJNI()

使用GetMethodID,它接受​​类检查,方法的字符串名称及其签名。由于这是一个没有参数的void函数,因此signature只是()V

jmethodID method = env->GetMethodID(cls, "javaMethodTobeCalledInJNI", "()V");

调用javaMethodTobeCalledInJNI()

使用CallVoidMethod,它接受​​对象实例,方法ID和任何参数(在本例中为none):

env->CallVoidMethod(mainJavaClass, method);

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