2010-10-15 20 views
11

Mam dużą bibliotekę C/C++, której potrzebuję użyć jako część projektu Android NDK. Ta biblioteka musi być w stanie inteligentnie przetwarzać łańcuchy UTF8 (na przykład konwersję na małe/wielkie litery).Obsługa Unicode w Androidzie ndk

Biblioteka ma warunkową kompilację do puntu do interfejsu API systemu operacyjnego w celu przeprowadzenia konwersji, ale nie wydaje się, aby istniały żadne interfejsy API systemu Android dla UTF8. (mbstowcs, itp.)

This thread mówi, aby użyć metody JNI, aby to zrobić (!), co jest raczej ciężkim rozwiązaniem.

Myślałem o zbudowaniu ICU, ale ponieważ używa GNU Autotools, nie jestem pewien, czy uda mi się to zrobić z narzędziem NDK toolchain. :/

Czy ktoś inny zmierzył się z tym problemem i zrobił coś innego niż JNI?

EDIT: Moi próbach uzyskania ICU kompilacji nie na etapie configure:

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

Czy zdarzyło Ci się, że to zadziałało? – tofutim

+0

@tofutim nie, ale nie byłem w stanie powtórzyć tego. – paleozogt

+0

Występuje właśnie ten problem. – tofutim

Odpowiedz

10

Używamy ICU w NDK. Postępuj zgodnie z instrukcjami w instrukcji budowy krzyżowej ICU, a wszystko będzie w porządku. Zasadniczo będziesz mieć macierzysty katalog ICU (na przykład Windows lub Linux), ICU Cygwin (jeśli używasz takiego) i jeszcze inny dla ICU Android (ARM). Brzmi szalenie, ale działa!

Oto kroki budowania pod Cygwin. Korzystam z NDK r4 "CrystaX", ale powinien on również być budowany po wyjęciu z pudełka NDK. ICU w wersji 4.4, ale działa również z poprzednimi wersjami.

  1. Patches:

  2. Zbuduj swoją wersję hosta ICU (np. Windows) jak za normalne. (Zadzwonimy to $ HOST_ICU)

  3. Budowa Cygwin ICU:

    • Utwórz katalog OIOM-Cygwin (Zadzwonimy to $ ICU_CROSS_BUILD)
    • Od OIOM-cygwin katalogu, uruchom " $ HOST_ICU/źródło/runConfigureICU Cygwin'
    • zrobić
  4. Budowanie NDK wersję OIOM:

    • Utwórz katalog icu-android
    • Z katalogu icu-android: '$ HOST_ICU/source/configure' z odpowiednimi opcjami wiersza poleceń. --with-cross-build = $ ICU_CROSS_BUILD i --host = arm-eabi jest wymagany.
    • zrobić

używam coś takiego za przekazany (krok 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 

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

I dodatkowe parametry konfiguracyjne:

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

Nie zrobiłem tego ręcznie przez jakiś czas, obecnie jest to wszystko w niestandardowym skrypcie budowania opartym na Pythonie. Jeśli napotkasz inne problemy, prawdopodobnie powiem ci, na czym polega problem.

Powodzenia!

+0

Edytowałem pytanie, aby pokazać, co dzieje się, gdy próbuję zbudować ICU z NDK – paleozogt

+0

ciekawych łatek, powinieneś pomyśleć o złożeniu z nimi biletu, aby je wesprzeć –

+0

Ja na pewno .Mam nadzieję, że Androidowi zdecyduj się na udostępnienie pełnego preinstalowanego ICU, ponieważ jest już używany na urządzeniach – NuSkooler