2010-10-15 19 views
11

Tengo una gran biblioteca C/C++ que necesito usar como parte de un proyecto Android NDK. Esta biblioteca debe ser capaz de procesar de manera inteligente las cadenas UTF8 (por ejemplo, la conversión a minúsculas/mayúsculas).soporte unicode en android ndk

La biblioteca tiene una compilación condicional para punt a una API del sistema operativo para hacer la conversión, pero no parece haber ninguna API de Android para UTF8. (mbstowcs, etc.)

This thread dice que debe usar métodos JNI para hacerlo (!), que es una solución bastante pesada.

Estaba pensando en construir ICU, pero como usa GNU Autotools no estoy seguro de poder hacerlo funcionar con la cadena de herramientas NDK. :/

¿Alguien más ha enfrentado este problema y ha hecho algo más que usar JNI?

EDIT: Mis intentos de conseguir la UCI para compilar fallan en el paso de configuración:

checking wchar.h usability... no 
checking wchar.h presence... yes 
configure: WARNING: wchar.h: present but cannot be compiled 
configure: WARNING: wchar.h:  check for missing prerequisite headers? 
configure: WARNING: wchar.h: see the Autoconf documentation 
configure: WARNING: wchar.h:  section "Present But Cannot Be Compiled" 
configure: WARNING: wchar.h: proceeding with the preprocessor's result 
configure: WARNING: wchar.h: in the future, the compiler will take precedence 
checking for wchar.h... yes 
checking for library containing wcscpy... none required 
checking size of wchar_t... 0 
configure: error: There is wchar.h but the size of wchar_t is 0 
+0

¿Alguna vez ha conseguido que esto funcione? – tofutim

+0

@tofutim no, pero tampoco he podido volver a visitarlo. – paleozogt

+0

Encontrando exactamente este problema. – tofutim

Respuesta

10

Estamos utilizando la UCI en el NDK. Sigue los pasos en las instrucciones de construcción cruzada de la ICU y estarás bien. Básicamente, tendrá un directorio nativo de ICU (por ejemplo, Windows o Linux), una ICU Cygwin (si se usa) y otra para ICU Android (ARM). ¡Suena loco pero funciona!

Estos son los pasos para construir bajo Cygwin. Estoy usando el NDK r4 de "CrystaX", pero también debería ser compatible con el NDK de fábrica. ICU versión 4.4, pero también ha funcionado con versiones anteriores.

  1. Parches:

  2. Cree su versión de host de ICU (p. Ej. Windows) como de costumbre. (Vamos a llamar a esta HOST_ICU $)

  3. Construir Cygwin UCI:

    • Crear un directorio UCI-cygwin (Llamaremos a este ICU_CROSS_BUILD $)
    • De dir UCI-cygwin, ejecute ' $ HOST_ICU/fuente/runConfigureICU Cygwin'
    • hacer
  4. Build versión NDK de la UCI:

    • Crear un directorio UCI-androide
    • De dir UCI-android: '$ HOST_ICU/fuente/configure' con las opciones de línea de comandos correspondientes. --with-cross-build = $ ICU_CROSS_BUILD y --host = arm-eabi es obligatorio.
    • hacen

utilizo algo como esto durante aprobada en (al paso # 4) CPPFLAGS/CXXFLAGS/CFLAGS:

-I$NDK_ROOT/build/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib 

Y para LDFLAGS:

-lc -Wl,-rpath-link=$NDK_ROOT/build/platforms/android-8/arch-arm/usr/lib/ -L$NDK_ROOT/build/platforms/android-8/arch-arm/usr/lib/ 

Y parámetros de configuración adicionales:

--enable-extras=no --enable-strict=no --enable-static --enable-shared=no --enable-tests=no --enable-samples=no --enable-dyload=no --enable-tools=no --host=arm-eabi --with-data-packaging=archive 

No he hecho esto manualmente por un tiempo, actualmente todo está en un guión de compilación basado en Python personalizado. Si se encuentra con otros problemas, probablemente pueda decirle cuál es el problema.

¡Buena suerte!

+0

He editado la pregunta para mostrar lo que sucede cuando trato de construir ICU con el NDK. – paleozogt

+0

parches interesantes, debe pensar en llenar un ticket con ellos para contribuir con ellos –

+0

Sin duda lo haré. Mi verdadera esperanza es que los desarrolladores de Android decide exponer una UCI completa preinstalada ya que se usa en los dispositivos. – NuSkooler