Tengo una aplicación Java que utiliza una DLL C++ a través de JNI. Algunos de los métodos de la DLL toman argumentos de cadena y algunos de ellos también devuelven objetos que contienen cadenas.Transferencia de cadenas de doble byte (WCHAR) de C++ a Java a través de JNI
Actualmente la DLL no es compatible con Unicode, por lo que el manejo de cadenas es bastante fácil:
- Java llama String.getBytes() y pasa la matriz resultante a la DLL, que simplemente trata los datos como un char *.
- La DLL usa NewStringUTF() para crear una cadena js desde un const char *.
Ahora estoy en el proceso de modificar la DLL para que sea compatible con Unicode, cambiando al uso del tipo TCHAR (que cuando se define UNICODE usa el tipo de datos WCHAR de Windows). Modificar la DLL va bien, pero no estoy seguro de cómo modificar la parte JNI del código.
Lo único que se me ocurre en este momento es la siguiente:
- Java llama String.getBytes (cadena charsetName) y pasa la matriz resultante a la DLL, que trata los datos como un wchar_t *.
- DLL ya no crea cadenas, sino que pasa jbyteArrays con los datos de cadena sin formato. Java usa el constructor String (byte [] bytes, String charsetName) para crear realmente el String.
El único problema con este método es que no estoy seguro de qué nombre de conjunto de caracteres utilizar. Los WCHAR tienen 2 bytes de longitud, así que estoy bastante seguro de que es UTF-16, pero hay 3 posibilidades en el lado de Java. UTF-16, UTF-16BE y UTF-16LE. No he encontrado ninguna documentación que me diga cuál es el orden de bytes, pero probablemente pueda averiguarlo a partir de algunas pruebas rápidas.
¿Hay una manera mejor? Si es posible, me gustaría continuar construyendo los objetos jstring dentro de la DLL, ya que de esa manera no tendré que modificar ninguno de los usos de esos métodos. Sin embargo, el método NewString JNI no toma un identificador de juego de caracteres.
Hm, no había considerado convertir primero la cadena de caracteres anchos en una cadena utf-8. Supongo que para usar ese método, ¿me gustaría el argumento de la página de códigos CP_UTF8? – Herms
Sí, el argumento de la página de códigos debe ser CP_UTF8. –
Gracias por el código de ejemplo. No estaba completamente seguro acerca de algunos de esos argumentos, y es bueno tener la confirmación de que acerté. :) – Herms