2013-05-12 2 views
1

J'ai fonction dans le code natif void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, CXToken **Tokens, unsigned *NumTokens);Comment faire passer un pointeur vers un pointeur (**) dans JNA?

La fonction va revenir tableau alloué de jetons en jetons **Tokens et comptent dans *NumTokens. J'ai généré des structures en utilisant jnaerator, donc elles sont prêtes. comment puis-je écrire la signature de la fonction dans Java (pointeur vers le pointeur est la principale difficulté)? Pour les non signés * j'ai IntByReference dans JNA. Devrais-je utiliser PointerByReference? Donnez-moi par exemple s'il vous plaît

Répondre

2

Supposant CXToken est un struct, et la fonction appelée est retourne un tableau attribué par l'appelé:

PointerByReference pref = new PointerByReference(); 
IntByReference iref = new IntByReference(); 

clang_tokenize(tu, range, pref, iref); 
CXToken token = new CXToken(pref.getValue()); 
CXToken[] tokens = (CXToken[])token.toArray(iref.getValue()); 
+0

Merci! Je vais donner un essai –

+0

Dans la dernière ligne, je reçois une erreur: java.lang.IndexOutOfBoundsException: Limites dépasse l'espace disponible: taille = 8, décalage = 48 \t à com.sun.jna.Memory.boundsCheck (Memory.java:197) \t à com.sun.jna.Memory $ SharedMemory.boundsCheck (Memory.java:73) \t à com.sun.jna.Memory.share (Memory.java:115) \t au com .sun.jna.Structure.toArray (Structure.java:1261) \t à com.sun.jna.Structure.toArray (Structure.java:1280) –

+0

toke.size() n'est pas égal à iref.getValue() pour une raison quelconque, mais il devrait être à mon humble avis. Je comprends que la valeur est renvoyée par Clang et elle peut être fausse, mais je pense qu'elle a été suffisamment testée. –

Questions connexes