2016-11-04 6 views
0

私は現在JNIについて学んでいます。 int * arrayを入力として取るC/C++ライブラリ関数があるとしましょう(intは4バイトで、Javaと同じように署名されていると仮定します)。すなわち、配列として渡されたポインタです。そのような関数にJavaの配列を渡すことは可能ですか?コピーを行わずにJNIを使​​用することは可能でしょうか(もちろん、Java配列の長さ部分は削除します)。直接のByteBufferは、このようなことを実行するための唯一の実行可能なメソッドですか?配列をとるC/C++関数にJava配列を渡すことはできますか?

答えて

2

直接ByteBufferは、あなた自身を言及しているように、コピーを避ける1つの方法です。

あなたがコピー(またはGet<Primitive>ArrayRegionが、それはそれ常にコピーするので意味をなさないだろう)もありますがGet<Primitive>ArrayElementsを呼び出す必要がありますJava配列を渡す場合。

「短い」時間だけ要素にアクセスする必要があり、要素を解放する前に他のJNI呼び出しを実行する必要がない場合に使用できるGetPrimitiveArrayCriticalもあります。コピーしない場合は、Get<Primitive>ArrayElementsより "可能性が高い"です。

例:

jint len = env->GetArrayLength(myIntArray); 
jint *elements = env->GetPrimitiveArrayCritical(myIntArray, NULL); 

// Use elements... 

env->ReleasePrimitiveArrayCritical(myIntArray, elements, 0); 

Oracle's JNI documentationを参照してください。

+0

したがって、基本的にByteBufferはこれを実現する唯一の信頼できる方法ですか? – pythonic

+0

あなたが特定の方法で動作することがわかっている特定のVMをターゲットにしているのでない限り、私はそう思います。 – Michael

関連する問題