我想将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();
}
答案 0 :(得分:15)
您的方法声明:
class MainJavaClass {
native void JNIMethod(JavaClassParameter object);
}
表示javah应生成如下的前向声明:
JNIEXPORT void JNICALL Java_MainJavaClass_JNIMethod(JNIEnv* env, jobject mainJavaClass);
在实施中,你有几件事要做:
使用FindClass
,它采用字符串名称:
jclass cls = env->FindClass("JavaClassParameter");
使用GetMethodID
,它接受类检查,方法的字符串名称及其签名。由于这是一个没有参数的void函数,因此signature只是()V
:
jmethodID method = env->GetMethodID(cls, "javaMethodTobeCalledInJNI", "()V");
使用CallVoidMethod
,它接受对象实例,方法ID和任何参数(在本例中为none):
env->CallVoidMethod(mainJavaClass, method);
您应该在每个步骤后检查NULL结果;如果从一个JNI函数返回NULL并将其传递给另一个JNI函数,则通常会使JVM崩溃