私は現在JNIについて学んでいます。 int * arrayを入力として取るC/C++ライブラリ関数があるとしましょう(intは4バイトで、Javaと同じように署名されていると仮定します)。すなわち、配列として渡されたポインタです。そのような関数にJavaの配列を渡すことは可能ですか?コピーを行わずにJNIを使用することは可能でしょうか(もちろん、Java配列の長さ部分は削除します)。直接のByteBufferは、このようなことを実行するための唯一の実行可能なメソッドですか?配列をとるC/C++関数にJava配列を渡すことはできますか?
0
A
答えて
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を参照してください。
関連する問題
- 1. 配列とポインタを関数に渡す
- 2. requestParamsに配列を渡すことはできますか?
- 3. PHP連想配列をComVisible .NET関数に渡すことはできますか?私はPHPインデックスとする配列を渡すと
- 4. javaの汎用メソッドにint配列を渡すことはできますか?
- 5. 配列を関数に渡すか、配列がスコープ内にあることを確認しますか?
- 6. Laravelはブレードに配列を渡すことができます
- 7. 私の関数に配列を渡すことができません
- 8. 「オンザフライ」配列をC関数に渡すことは可能ですか? FORTRANで
- 9. Powershell:配列を関数に渡すときにWhatIfを使う
- 10. 関数に渡す配列
- 11. 特定の数の参照配列を関数にパラメータとして渡すことはできますか?
- 12. 関数内のパラメータ配列を動的に渡すこと
- 13. Javaで整数配列をオーバーライドすることはできますか?
- 14. 配列とプリミティブの両方をJavaで配列に含めることはできますか?
- 15. 配列へのポインタを関数に渡すときのセグメンテーションフォールト(C++)
- 16. 2D char *配列を関数に渡すときのエラー
- 17. javascript関数でパラメータとしてopitional配列を渡すには?
- 18. 配列を入力としてジオメトリシェーダに渡すことはできますか?
- 19. 配列を関数に渡すことはできますか?rest *構造ですか?
- 20. Javaのパラメータとして配列を渡すことができません
- 21. Javaで配列を渡す
- 22. Javaで配列を渡す
- 23. 子コンポーネントに配列を渡すことができません
- 24. C++で配列の配列を作ることはできますか?
- 25. 配列をC++の関数に渡すときにスタックオーバーフローを避けるには?
- 26. PHP関数内のJavaScript配列にPHP配列を渡す
- 27. 文字列を配列関数に渡すことができません:添え字が範囲外です
- 28. 内部配列を関数に渡す
- 29. ejs配列をjavascript関数に渡す
- 30. 文字配列を関数に渡す
したがって、基本的にByteBufferはこれを実現する唯一の信頼できる方法ですか? – pythonic
あなたが特定の方法で動作することがわかっている特定のVMをターゲットにしているのでない限り、私はそう思います。 – Michael