поддержка Unicode в Android ndk - PullRequest
       33

поддержка Unicode в Android ndk

11 голосов
/ 15 октября 2010

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

В библиотеке имеется условная компиляция для добавления в API-интерфейс ОС для выполнения преобразования, но, похоже, нет API-интерфейсов Android для UTF8. (сообщения и т. д.)

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

Я думал о сборке ICU , но поскольку он использует автоинструменты GNU, я не уверен, что смогу заставить его работать с помощью цепочки инструментов 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'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

1 Ответ

11 голосов
/ 16 октября 2010

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

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

  1. Патчи:

  2. Создайте версию ICU своего хоста (например, Windows) в обычном режиме (мы назовем это $ HOST_ICU)

  3. Сборка Cygwin ICU:

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

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

Я использую что-то вроде этого для передачи в (тo шаг # 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.Если у вас возникнут другие проблемы, я, вероятно, расскажу вам, в чем проблема.

Удачи!

...