Как написать / прочитать прямой ByteBuffer на родном языке? - PullRequest
1 голос
/ 24 июня 2011

Я хочу получить данные из сокета в нативной части, а затем прочитать данные в коде Java. Я знаю, что прямой ByteBuffer может быть хорошим выбором. Поэтому я подготавливаю ByteBuffer в Java что-то вроде

ByteBuffer myBuffer = ByteBuffer.allocateDirect(128); 

И я получаю этот 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; .....}

Теперь моя глупая проблема:

(1) Правильно ли, что я могу получить переменную типа int socketfd просто из оператора "socketfd = fd" ??? (fd это тип jint, и это действительно сокет fd в Linux) (2) Как я могу записать данные в этот ByteBuffer в C ???

В самом деле, ... Моя ситуация такова, что я получаю сокет Linux fd в другой встроенной функции C ++, однако я не могу добавить в нее нужные функции. Я хочу использовать этот fd для чтения / записи данных, но я знаю, что это невозможно в коде Java. Поэтому я решил передать его в native и использовать прямой ByteBuffer для хранения временных данных.

Есть предложения?

Спасибо.

1 Ответ

2 голосов
/ 24 июня 2011

Вы можете читать записи в FileDescriptors на Java.

Однако для чтения / записи в прямой буфер все, что вам нужно, это чтение / запись из вашего BUFF и обновление position и limit в зависимости от ситуации.

...