Ho un'applicazione Java che utilizza una DLL C++ tramite JNI. Alcuni dei metodi della DLL accettano argomenti stringa e alcuni di essi restituiscono anche oggetti contenenti stringhe.Passaggio di stringhe a doppio byte (WCHAR) da C++ a Java tramite JNI
Attualmente il DLL non supporta Unicode, così la gestione delle stringhe è piuttosto facile:
- Java chiama String.getBytes() e passa la matrice risultante alla DLL, che tratta semplicemente i dati come char *.
- DLL usa NewStringUTF() per creare una jstring da un const char *.
Sono ora in fase di modifica della DLL per supportare Unicode, passando all'utilizzo del tipo TCHAR (che quando UNICODE è definito utilizza il tipo di dati WCHAR di Windows). La modifica della DLL sta andando bene, ma non sono sicuro di come modificare la parte JNI del codice.
L'unica cosa che mi viene in mente in questo momento è questa:
- Java chiama String.getBytes (String charsetName) e passa la matrice risultante alla DLL, che tratta i dati come un wchar_t *.
- DLL non crea più stringhe, ma passa jbyteArrays con i dati di stringa non elaborati. Java utilizza il costruttore String (byte [] bytes, String charsetName) per creare effettivamente la stringa.
L'unico problema con questo metodo è che non sono sicuro del nome del set di caratteri da utilizzare. I WCHAR sono lunghi 2 byte, quindi sono abbastanza sicuro che sia UTF-16, ma ci sono 3 possibilità sul lato java. UTF-16, UTF-16BE e UTF-16LE. Non ho trovato alcuna documentazione che mi indichi quale sia l'ordine dei byte, ma posso probabilmente capirlo da alcuni test rapidi.
C'è un modo migliore? Se possibile mi piacerebbe continuare a costruire gli oggetti jstring all'interno della DLL, in questo modo non dovrò modificare nessuno degli usi di quei metodi. Tuttavia, il metodo JNI NewString non accetta un identificatore del set di caratteri.
Hm, non aveva considerato di convertire prima la stringa wide-char in una stringa utf-8. Presumo che per usare quel metodo vorrei l'argomento della codepage CP_UTF8? – Herms
Sì, l'argomento CodePage deve essere CP_UTF8. –
Grazie per il codice di esempio. Non ero completamente sicuro di un paio di questi argomenti, ed è bello avere conferma che ho indovinato. :) – Herms