2011-06-24 14 views
0

ネイティブ部分のソケットからデータを受信し、Javaコードのデータを読み込みたいとします。 私は直接ByteBufferが良い選択かもしれないことを知っています。だから私は直接のByteBufferをネイティブに書き込む/読む方法は?

ByteBuffer myBuffer = ByteBuffer.allocateDirect(128); 

のようなJava何かでのByteBufferを準備し、私は次のコード

JNIEXPORT jboolean JNICALL Java_nfore_android_bt_pro_nfhfp_rcvSco(JNIEnv *env, jobject this, jint fd, jobject buff){ 

int buff_size; 
int socketfd; 

jbyte *BUFF = (*env)->GetDirectBufferAddress(env, buff); 
buff_size = (*env)->GetDirectBufferCapacity(env, buff); 

socketfd = fd; .....} 

によってネイティブでこれのByteBufferを取得し、私の愚かな問題が

(1)ですされていますステートメントからちょうどint型変数、socketfdを得ることができることを修正しました。 "socketfd = fd" ??? (fdはjint型であり、実際にはLinuxのソケットfdです) (2)このByteBufferにどのようにデータを書き込むことができますか?

確かに... 私の状況では、別のネイティブC++関数でLinuxソケットfdを取得していますが、私が望む機能を追加できませんでした。私はデータを読み書きするためにこのfdを使いたいですが、Javaコードでは不可能です。だから私はネイティブに渡し、直接ByteBufferを使って一時データを保存することにしました。

提案がありますか?

ありがとうございます。

答えて

1

JavaのFileDescriptorsに書き込むことができます。

直接バッファに読み書きするには、BUFFから読み書きし、positionlimitを必要に応じて更新する必要があります。

+0

ピーター、ご返信ありがとうございます。だから私はCで通常のバッファ(ポインタ)のようにBUFFを使用できますか? –

+1

はい、ダイレクトByteBufferのポイントです。バッファは普通の "C"メモリです(ByteBufferはJavaオブジェクトですが、ストレージはありません)。 ;) –

+0

OK、私はそれを得た。ありがとう、ピーター。 –