comment ecrire et lire de bytebuffer passant de java a jni

J’ai besoin d’aide pour mon projet Android. Je souhaite passer un tampon de java à jni et mon code C ++ remplira les données. Ensuite, Java les affichera à l’écran. Je ne connais pas beaucoup C ++ et je ne sais pas comment écrire pour écrire dans le tampon.

c’est ce que j’ai. en java

ByteBuffer bb = ByteBuffer.allocateDirect(216); IssmJni.processBuffer(bb); 

méthode native

 public static native void processBuffer(ByteBuffer bb); 

Je n’utilise pas jni_onload, donc pas de javah en C ++

 static void fillBuffer(JNIEnv *env, jclass clazz, jobject buf) { double *dBuf = env->GetDirectBufferAddress(env, buf); } 

Je suis coincé ici, puis-je faire double dbuf? ou est-ce que c’est un char ?

Let a dit que je veux écrire 1,2,3,4,5 à cette dbuf, comment puis-je le faire? je pense à dbuf.put (1); … dbuf.put (5) mais cela ne fonctionne pas. et après l’avoir renseignée, dois-je simplement appeler bb.get (position) en java?

Quelqu’un clarifie cela pour moi s’il vous plaît, l’exemple serait apprécié Merci

c’est mon tableau de méthodes natives

static JNINativeMethod method_table [] = {

 {"fac" , "(J)J" , (void *) factorial}, {"getBuffer", "()[D" , (void *) getBufferNative}, //{"processBuffer", "(Ljava/nio/ByteBuffer)V", (void *) fillBuffer}}; 

Les deux autres fonctionnent bien sauf le dernier.

Je n’utilise pas jni_onload, donc pas de javah en C ++

Cela peut n’être pas pertinent pour votre question, mais vous devez en quelque sorte faire l’une ou l’autre. Vous devez soit mapper votre méthode Java sur Natif dans la fonction onLoad, soit utiliser javah pour générer les signatures de méthode que JNI peut extraire au moment de l’exécution. Sinon, vos méthodes natives ne seront jamais invoquées.

Cependant, si votre méthode native est correctement appelée, quoi que vous fassiez, cela ira probablement bien.

Je suis coincé ici, puis-je faire double dbuf? ou est-ce que c’est un char?

La valeur de retour de la fonction est en fait un void* , vous pouvez donc la transtyper vers le type de pointeur souhaité, car il ne s’agit que d’une adresse mémoire. Cependant, le type de données réel de la mémoire tampon directe sera jbyte , qui est une typedef de caractère signed char , de sorte que ce qui suit est probablement préférable:

 jbyte *dBuf = env->GetDirectBufferAddress(env, buf); 

Let a dit que je veux écrire 1,2,3,4,5 à cette dbuf, comment puis-je le faire?

La notation en C / C ++ permettant d’accéder aux valeurs d’un tableau est avec des notations [], c’est-à-dire:

 jbyte *dBuf = env->GetDirectBufferAddress(env, buf); dBuf[0] = 63; dBuf[1] = 127; // ...and so on... 

et après l’avoir renseignée, dois-je simplement appeler bb.get (position) en java?

Oui, vous pouvez utiliser les méthodes d’access de ByteBuffer pour accéder aux données que vous avez écrites à partir de votre code natif.