Android ndk 如何将java类实例作为参数传递给JNI方法?
我想把java类对象传递给JNI方法, 我想在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
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);