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

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

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

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

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

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

EDIT: мои попытки скомпилировать 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'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 

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

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

  1. Патчи:

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

  3. Постройте ICU Cygwin:

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

    • Создайте каталог icu-android
    • Из каталога icu-android: '$ 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. Если вы столкнетесь с какими-либо другими проблемами, я, вероятно, скажу вам, в чем проблема.

Удачи!