2017-07-19 79 views
0

我已經搜索了這個問題,並找到了一些答案,但還沒有真正找到我在找什麼。 我使用C++的JNI調用Java,並逐個設置Java對象的字段。如下所示:將C++對象傳遞給Java,並使用JNI逐個設置對象參數

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); 

回答

0

不,你只能調用方法和構造以及獲取和設置在Java中定義的字段。

是的:你可以用Java定義額外的類和方法,它將在一次調用中做你需要的。例如,myObj:getObjMethodID似乎是一種工廠方法。你可以添加一個方法重載,它接受你想用來初始化創建對象的所有值。一般來說,如果你能在Java中使事情強大,那麼在JNI中完成的任務將會更簡單。

+0

myObj :: getObjMethodID是工廠,但我只能一個一個地設置參數,而不是一勞永逸。我無法一次通過所有參數,因爲可能有數十個參數。 我已編輯我的帖子,以顯示我在找什麼。在本機端創建一個對象並將該對象設置爲Java端。 – nav