使用JNI

时间:2017-07-19 08:00:05

标签: 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->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);

1 个答案:

答案 0 :(得分:0)

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

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

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