gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:57:58 26 4
gpt4 key购买 nike

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

意味着 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 和任何参数(在这种情况下没有):
env->CallVoidMethod(mainJavaClass, method);

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

关于android-ndk - 如何将java类实例作为参数传递给JNI方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4468276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com