2017-07-19 6 views
0

この質問を検索していくつかの回答を見つけましたが、私が探しているものが見つかりませんでした。 C++からJNIを使​​用してJavaを呼び出し、Javaオブジェクトのフィールドを1つずつ設定します。以下のような何か:JNIを使​​用してC++オブジェクトをJavaとセットオブジェクトパラメータを1つずつ渡します

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

jSomeObject内のすべてのパラメータは、このように一つずつ設定されています。そして、あなたは高価なJNIコールが複数存在することがわかります。私が考えているのは、ネイティブ環境ですべてのパラメータを設定し、複数のJNI呼び出しを避けるためにオブジェクトを1回だけ送信する方法がある場合です。 投稿の中には、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で定義して、1回の呼び出しで必要な処理を行うことができます。たとえば、myObj:getObjMethodIDはファクトリメソッドであるようです。作成されたオブジェクトを初期化するすべての値を取るメソッドオーバーロードを追加することができます。

一般的に、Javaでパワフルにすることができれば、JNIで行われる作業は簡単になります。

+0

myObj :: getObjMethodIDはファクトリですが、パラメータを1つずつ設定できますが、1つは設定できません。私は1つにすべてのパラメータを渡すことはできませんので、それらの数十がある可能性があります。 自分の投稿を編集して、私が探しているものを表示しました。ネイティブ側にオブジェクトを作成し、そのオブジェクトをJava側に設定します。 – nav

関連する問題