将对象传递给 Java C++与使用 JNI 逐个设置对象参数

Pass C++ object to Java vs set object parameters one by one using JNI

本文关键字:对象 JNI 设置 参数 Java C++      更新时间:2023-10-16

我已经搜索了这个问题并找到了一些答案,但并没有真正找到我想要的东西。 我使用 C++ 中的 JNI 调用 Java,并逐个设置 Java 对象的字段。如下所示:

jobject jSomeObject = (jobject) JVM_ENV->CallObjectMethod(myObj, getObjMethodID, "");
JVM_ENV->CallVoidMethod(jSomeObject , setMethodID1, SomeIntVal);
JVM_ENV->CallVoidMethod(jSomeObject , setMethodID2, SomeStringVal);

jSomeObject 中的所有参数都是像这样一一设置的。而且您会看到有多个 JNI 呼叫正在进行,这很昂贵。我在想的是,如果有一种方法可以在本机环境中设置所有参数并仅发送一次对象以避免多次 JNI 调用。 一些帖子说不可能将自定义对象传递给 JNI。我能做到吗?

编辑: 上面的调用更改为:

jobject jSomeObject = (jobject) JVM_ENV->CallObjectMethod(myObj, getObjMethodID, "");
someClass obj = new someClass();
obj.setMethod1(someInvVal);
obj.setMethod2(someStringVal); // so on...
JVM_ENV->CallVoidMethod(jSomeObject , setMethodID1, obj);

否:您只能调用方法和构造函数,并获取和设置在 Java 中定义的字段。

是的:您可以在 Java 中定义其他类和方法,这些类和方法将在一次调用中完成您需要的操作。例如,myObj:getObjMethodID似乎是一种工厂方法。您可以添加一个方法重载,该方法重载采用要用来初始化所创建对象的所有值。

一般来说,如果你能在Java中使事情变得强大,那么在JNI中完成的任务就会更简单。