2012-02-18 9 views
3

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が発生します。

私は別の投稿を検索しましたが、情報はありません。この点で誰でも助けてくれますか?

答えて

0

ダイレクトバッファには、少なくとも一般的なJVMではバッキングJava配列が関連付けられていません。あなたはそのように使うことはできません。 Java配列内のデータが必要な場合は、一度ByteBuffer getを取得すると、一括get()操作を使用してバイトをJava配列にコピーできます。または、データの読み書きに適切なget/putを使用して、ByteBufferを直接使用することもできます。

関連する問題