2011-05-11 4 views
0

Je souhaite envoyer un objet struct-like de Java vers C++. Comme il n'y a pas de structure dans java, je suppose que je dois écrire une classe et ensuite envoyer une instance de cette classe.JNI - envoi d'instances de classe à C++

public class soundSource { 
    int posX; 
    int posY; 
    ..... 
} 

Mais ... le jobject que je reçois de méthode JNI en C++ - comment puis-je extraire les champs individuels?

Merci

Répondre

1

La réponse de Dennis est correcte, cependant, il y a une autre façon de faire cela, qui pourrait vous donner de meilleures performances, et ce via des buffers d'octets directs.

Voici les documents dont vous avez besoin de lire: JNI NIO support, ByteBuffer

vous allouez l'octet de mémoire tampon directe soit sur le côté Java ou du côté C. Vous remplissez ensuite le tampon, côté java, en utilisant les méthodes de ByteBuffer, en fonction de la disposition de votre c-struct. N'oubliez pas que ces tampons doivent être désalloués lorsque vous avez fini de les utiliser, mais vous pouvez réutiliser le même tampon pour transmettre des données en arrière-plan.

+0

comment accéder au membre du tampon? Si vous tenez pour acquis que le côté natif sait que le tampon contient un double, suivi d'un int, suivi d'un caractère, comment accéder aux valeurs? Donc, du côté Java, vous faites 'putDouble (1.2); putInt (4); putChar ('p'); ', comment les obtenez-vous dans le code natif? Juste intéressé que je n'ai jamais essayé cette approche avant. – Dennis

+0

@Dennis - vous lancez simplement le pointeur de la mémoire tampon (du côté C) vers le type struct correspondant, avec les définitions de membre appropriées. – pron

+0

donc 'struct TEST {double a; int b; char c;} out = (* env) -> GetDirectBufferAddress (env, le Buffer); '?? Agréable. – Dennis

1
jstr = (*env)->GetObjectField(env, obj, fid); 

Voir http://java.sun.com/docs/books/jni/html/fldmeth.html.

Vous n'envoyez "pas" les données n'importe où. Vous utilisez simplement l'interface JNI à la JVM pour accéder aux données. Vous n'avez même pas besoin que le champ soit public. Faites juste cela pour tous les champs de la classe qui vous intéresse et vous pouvez remplir votre structure en C++.