Utilisation de SWIG pour convertir C ++ char * en tant que char en Java au lieu de Ssortingng

J’essaie d’envelopper la fonction C ++ suivante avec Java:

char* MyClass::to_cssortingng(); 

Cette sortie de cette fonction est renvoyée sous forme d’object Java Ssortingng. Je voudrais qu’il retourne comme un tableau Java char[] . J’utilise actuellement “typemaps.i” et “std_ssortingng.i”. Existe-t-il un moyen de remplacer le comportement tel que std :: ssortingng est toujours renvoyé en tant que Ssortingng Java, mais char* est renvoyé en tant que tableau de caractères Java?

Que diriez-vous d’utiliser Java byte[] au lieu de char[] pour ne pas avoir à vous soucier de la traduction entre les caractères C ++ 8 bits et le format Unicode 16 bits de Java?

Pour ce faire, vous devrez remplacer les cartes typographiques fournies par SWIG par défaut par l’une des vôtres. La façon la plus simple de procéder consiste simplement à écrire du “colle” Java:

 %module test %typemap(jstype) char *to_cssortingng() "byte[]"; %typemap(javaout) char *to_cssortingng() { return $jnicall.getBytes(); } %inline %{ char *to_cssortingng() { static char ret[] = "hello world"; return ret; } %} 

Faites exactement ce que vous voulez en appelant getBytes() dans les coulisses de la Ssortingng renvoyée par défaut.

Vous pouvez également le faire avec votre propre JNI pour le renvoyer sous forme de tableau d’octets depuis votre code natif:

 %module test %typemap(jstype) char *to_cssortingng() "byte[]"; %typemap(jtype) char *to_cssortingng() "byte[]"; %typemap(javaout) char *to_cssortingng() { return $jnicall; } %typemap(jni) char *to_cssortingng() "jbyteArray"; %typemap(out) char *to_cssortingng() { const size_t len = strlen($1); $result = JCALL1(NewByteArray, jenv, len); // TODO: check that this succeeded JCALL4(SetByteArrayRegion, jenv, $result, 0, len, (const jbyte*)$1); } %inline %{ char *to_cssortingng() { static char ret[] = "hello world"; return ret; } %} 

La différence ici est que le mappage sur byte[] se produit dans le fichier JNI généré, pas dans la colle Java. La colle vient maintenant de remplacer directement les JNI directement.

J’ai pu tester et vérifier ces cartes de type avec le Java suivant:

 public class run { public static void main(Ssortingng[] argv) { System.loadLibrary("test"); byte[] ret = test.to_cssortingng(); System.out.println(ret.length); System.out.println((char)ret[0]); } } 

Dans ces deux exemples, les typemaps correspondent à la fois au type de retour ( char * ) et à la fonction to_cssortingng() . Vous pouvez ajuster cette correspondance de typemap pour qu’elle soit plus ou moins sélective. Actuellement, cela ne modifie pas l’utilisation la plus normale, vous pouvez également utiliser %apply pour copier le typemap dans d’autres cas qui ne correspondent pas exactement.