通过C&x2B+;对象到Java vs使用JNI逐个设置对象参数

通过C&x2B+;对象到Java vs使用JNI逐个设置对象参数,java,c++,java-native-interface,Java,C++,Java Native Interface,我已经搜索了这个问题,找到了一些答案,但还没有真正找到我要找的。 我用C++从JNI调用java,并逐个设置java对象的字段。如下所示: jobject jSomeObject = (jobject) JVM_ENV->CallObjectMethod(myObj, getObjMethodID, ""); JVM_ENV->CallVoidMethod(jSomeObject , setMethodID1, SomeIntVal); JVM_ENV->CallVoidMet

我已经搜索了这个问题,找到了一些答案,但还没有真正找到我要找的。 我用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中完成的任务会更简单。

myObj::getObjMethodID是工厂,但我只能一个接一个地设置参数,而不是一次性设置。我无法一次性传递所有参数,因为可能有几十个参数。我已经编辑了我的帖子,以显示我在寻找什么。在本机端创建一个对象,并将该对象设置为Java端。