からデータをマーシャリングするための最速の方法は何ですか:Javaでは私は多くのデータ・フィールド(> 15)を含むCデータ構造を持っていると仮定しJNI
struct MyData
{
int x;
float y;
...
}
、私はのMyDataへのポインタを格納することができますCのデータ構造の長い、およびアクセスメンバーとしてJNIを通じて呼び出す:
long mydata_p = MyDataJNI.alloc();
int x = MyDataJNI.getX(mydata_p);
float y = MyDataJNI.getY(mydata_p);
...
をしかし、これらの関数の呼び出しは、(同等のC関数呼び出しのコストを10倍、100倍)ショッキングに高価です。これは、getX、getYなどの実装が次のように単純であっても当てはまります。
return ((MyData*)())->x
Q1:JNIはなぜ高価ですか?関数ポインタの呼び出し以外に何が起こっていますか? (参考のために、私はJNIで探していますアンドロイドで呼び出します。)
Q2:Javaの層で私のC構造体の要素のすべてが利用できるようにするために何を最速は何ですか?代わりに、外部管理ポインタでネイティブ呼び出しの結果を格納する
Cの構造体をネイティブJavaオブジェクトにロードするのではなく、JNIを使用する魅力的な理由はありますか? –
Cの構造体は、Cライブラリによって多くの計算の結果です。 CからJavaオブジェクトを埋める別の方法はありますか? – user48956