JNIの新機能です.DirectBuffersを使用してJavaからC++に、そしてC++からJavaにバルクイメージデータを転送する必要があります。NewDirectByteBufer()を使用して作成したByteBufferに配列がありません
私はallocateDirectを使用してJavaコードで直接メモリを割り当てられ、次のようにそれを満たしている:私は
ByteBuffer myBuffer = ByteBuffer.allocateDirect(size);
myBuffer.orger(ByteOrder.nativeOrder());
myBuffer.put(imageByteArrayData);
SetImage(myBuffer)//MyNativeMethod in JNI
AtJni:
static void SetImage(JNIEnv* env, jobject thiz, jobject myBuffer)
{
char* marker = (char*)env->GetDirectBufferAddress(myBuffer);
gImageProcessor->ProcessImage(marker);//My other cpp class which process this image add some effects
}
私はCPPでこのマーカーのアドレスを確認したらJavaのmyBufferアドレス(デバッグモードの変数ウィンドウ経由)は、両方とも同じアドレスを指しています。
ここでは、直接バッファを割り当てた以前のJavaモジュールに接続していない他のJavaモジュールでこのイメージを取得する必要があります。
ImageProcessor.cppでgetProcessedImage()メソッドを呼び出しました。このメソッドは、char *ポインタをJNIに返します。
私の質問はここです:どのように追加の配列のコピーを実行せずにこのデータをJavaに返すことができますか?私はのByteBufferにjオブジェクトを変換するとき、私はこのオブジェクトによって表されるアドレスが同じ直接アドレスであることを見ることができていますが、.hasarray()
static jobject GetUpdatedImage(JNIEnv* env, jobject thiz)
{
gData = gImageProcessor->getProcessedImage();
jobject = (jobject)env->NewDirectByteBufer(gData, sizeofgdata);
return jobject;
}
しかし、Javaレベルで次のように私は、JNIでNewDirectByteBufferを使用して試してみました、.array()を呼び出し、その上の任意のメソッドを呼び出すと、UnSupportedOperationExceptionが発生します。
私は別の投稿を検索しましたが、情報はありません。この点で誰でも助けてくれますか?