Поддержка unicode в android ndk

У меня есть большая библиотека C/С++, которую мне нужно использовать как часть проекта Android NDK. Эта библиотека должна иметь возможность интеллектуально обрабатывать строки UTF8 (например, преобразование в нижний регистр или в верхний регистр).

В библиотеке есть условная компиляция для привязки к OS API для преобразования, но для UTF8 не существует никаких API Android. (mbstowcs и т.д.)

В этой ветке говорится использовать методы JNI для этого (!), что является довольно тяжелым решением.

Я думал о создании ICU, но поскольку он использует GNU Autotools, я не уверен, что смогу заставить его работать с NDK Набор инструментов.:/

Кто-нибудь еще столкнулся с этой проблемой и сделал что-то другое, кроме использования JNI?

РЕДАКТИРОВАТЬ: Мои попытки скомпилировать ICU на этапе настройки:

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 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

Ответ 1

Мы используем ICU в NDK. Следуйте инструкциям в инструкциях по сборке ICU, и все будет в порядке. В основном у вас будет родной каталог ICU (например, Windows или Linux), ICU Cygwin (если он используется) и еще один для ICU Android (ARM). Звучит безумно, но он работает!

Вот шаги для построения под Cygwin. Я использую "CrystaX" NDK r4, но он также должен строиться с помощью NDK. ICU версии 4.4, но также работал с предыдущими версиями.

  • Патчи:

  • Создайте свою версию хоста ICU (например, Windows) в соответствии с нормальным. (Мы будем называть это $HOST_ICU)

  • Постройте ICU Cygwin:

    • Создайте каталог icu-cygwin (мы назовем это $ICU_CROSS_BUILD)
    • Из каталога icu-cygwin запустите '$ HOST_ICU/source/runConfigureICU Cygwin'
    • сделать
  • Постройте версию NUK для ICU:

    • Создайте каталог icu-android
    • От icu-android dir: '$ HOST_ICU/source/configure' с соответствующими параметрами командной строки. --with-cross-build = $ICU_CROSS_BUILD и --host = arm-eabi не требуется.
    • сделать

Я использую что-то вроде этого для переданного (для шага # 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

И для 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/

И дополнительные параметры настройки:

--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

Я не делал этого вручную какое-то время, в настоящее время это все в пользовательской сборке на основе Python script. Если вы столкнетесь с какими-либо другими проблемами, я, вероятно, скажу вам, в чем проблема.

Удачи!