ICU knihovna v Android NDK

hlasů
2

Snažím se vytvořit JNI wrapper pro knihovnu C, která závisí na knihovnách JIP (libicuuc.so a libicui18n.so).

Snažil jsem se budova ICU4C v mém NDK (standardní i CrystaX verze, na počítači Mac OS X) a běžel do propojování problémy, jako je tento:

/Users/kyip/KyVmShared/KyAndroid/myproject/obj/local/armeabi/objs/icuuc/udata.o: In function `openCommonData':
/Users/kyip/KyVmShared/KyAndroid/myproject/jni/icu4c/common/udata.c:836: undefined reference to `icudt42_dat'
/Users/kyip/KyVmShared/KyAndroid/myproject/obj/local/armeabi/objs/icuuc/ustr_wcs.o: In function `_strFromWCS':
/Users/kyip/KyVmShared/KyAndroid/myproject/jni/icu4c/common/ustr_wcs.c:365: undefined reference to `wcstombs'
/Users/kyip/KyVmShared/KyAndroid/myproject/jni/icu4c/common/ustr_wcs.c:415: undefined reference to `wcstombs'
/Users/kyip/KyVmShared/KyAndroid/myproject/jni/icu4c/common/ustr_wcs.c:314: undefined reference to `wcstombs'
/Users/kyip/KyVmShared/KyAndroid/myproject/obj/local/armeabi/objs/icuuc/ustr_wcs.o: In function `_strToWCS':
/Users/kyip/KyVmShared/KyAndroid/myproject/jni/icu4c/common/ustr_wcs.c:164: undefined reference to `mbstowcs'
collect2: ld returned 1 exit status

Zkoušel jsem i návrh přijatý na unicode podporu android NdK , ale bez úspěchu. Uvízl jsem na adrese:

arm-eabi-g++ -I/ky/crystax/android-ndk-r4-crystax/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 -fPIC -DU_COMMON_IMPLEMENTATION  -D_REENTRANT -I../common -I../../icu/source/common -I../../icu/source/i18n   -DDEFAULT_ICU_PLUGINS=\/usr/local/lib/icu\   -DU_COMMON_IMPLEMENTATION -DHAVE_CONFIG_H  -I/ky/crystax/android-ndk-r4-crystax/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 -fPIC -DU_COMMON_IMPLEMENTATION  -std=c++0x  -fvisibility=hidden -c   -o errorcode.ao ../../icu/source/common/errorcode.cpp
In file included from ../../icu/source/common/unicode/ptypes.h:23,
                 from ../../icu/source/common/unicode/umachine.h:52,
                 from ../../icu/source/common/unicode/utypes.h:36,
                 from ../../icu/source/common/errorcode.cpp:17:
/ky/crystax/android-ndk-r4-crystax/build/platforms/android-8/arch-arm/usr/include/sys/types.h:122: error: 'uint64_t' does not name a type
make[1]: *** [errorcode.ao] Error 1
make: *** [all-recursive] Error 2

Jakýkoliv pomoci chtěl bych být ocenil.

Položena 12/11/2010 v 21:54
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
0

Tam byla snaha poskytnout NDK obálky pro JIP knihovny, které jsou součástí systému: https://android-review.googlesource.com/c/153001/ .

Odpovězeno 15/07/2017 v 10:32
zdroj uživatelem

hlasů
0

Zde je, jak jsem vyřešil problém. Je to špinavá, ale funguje to. Lib dostala sestaven:

1. soubor: /icu4c/common/cwchar.h

komentář mimo #if U_HAVE_WCHAR_Ha příslušná #endiftakže <wchar.h>je vždy součástí.

nahradit předchozí uprv_wcstombsdefinice se:

#define uprv_wcstombs(mbstr, wcstr, count) U_STANDARD_CPP_NAMESPACE wcs2mbs(mbstr, wcstr, count)

nahradit předchozí uprv_mbstowcsdefinice se:

#define uprv_mbstowcs(wcstr, mbstr, count) U_STANDARD_CPP_NAMESPACE mbs2wcs(wcstr, mbstr, count)

2. file: /icu4c/common/ustr_wcs.cpp

Někde nahoře pod již existující zahrnuje přidejte řádek:

#include "../wcsmbs.h"

3. vytvořit nový soubor "icu4c / wcsmbs.h"

size_t mbs2wcs(wchar_t * __ restrict pwcs, const char * __ restrict s, size_t n)
{

   mbstate_t mbs;
   const char *sp;
   memset(&mbs, 0, sizeof(mbs));
   sp=s;
   return (mbsrtowcs(pwcs,&sp,n,&mbs));
}


size_t wcs2mbs(char * __restrict s, const wchar_t * __restrict pwcs, size_t n)
{
   mbstate_t mbs;
   const wchar_t *pwcsp;
   memset(&mbs,0,sizeof(mbs));
   pwcsp = pwcs;
   return (wcsrtombs(s,&pwcsp,n,&mbs));
}

Doufám, že to pomůže.

Odpovězeno 24/06/2014 v 04:39
zdroj uživatelem

hlasů
0

Také jsem měl tento problém vyřešit: nedefinovaný odkaz na `mbstowcs'

Ty by měly vytvořit a propojit s vyšší verzi Android API.

Poznámka: Snažil jsem se spojit s knihovnami z android-NDK / platformy / android-4 ... Myslel jsem si, že 4 je verze Androidu, ale 4 je verze Android API. A Android API 4 odpovídá Android 1.6 čarodějnice je velice stará tam je opravdu žádná funkce mbstowcs v libc

Odpovězeno 23/05/2013 v 13:19
zdroj uživatelem

hlasů
0

Zdá se, že dva soubory jsou zapojeni do této problematiky. ICU / source / common / unicode / ptypes.h která vyzývá sys / types.h zahrnuje

#if ! U_HAVE_UINT64_T
    typedef unsigned long long uint64_t;
/* else we may not have a 64-bit type */
#endif

Zahrnutím sys / types.h z Androidu, zapojujeme (u linky 122/124)

#ifdef __BSD_VISIBLE
typedef unsigned char   u_char;
typedef unsigned short  u_short;
typedef unsigned int    u_int;
typedef unsigned long   u_long;

typedef uint32_t       u_int32_t;
typedef uint16_t       u_int16_t;
typedef uint8_t        u_int8_t;
typedef uint64_t       u_int64_t;
#endif

Zdá se, že uint64_t nebyl prohlášen, když je přiřazena u_int64_t. Ve skutečnosti, sys / types.h zahrnuje stdint.h, který má následující kroky:

#if !defined __STRICT_ANSI__ || __STDC_VERSION__ >= 199901L
#  define __STDC_INT64__
#endif

typedef __int8_t      int8_t;
typedef __uint8_t     uint8_t;
typedef __int16_t     int16_t;
typedef __uint16_t    uint16_t;
typedef __int32_t     int32_t;
typedef __uint32_t    uint32_t;
#if defined(__STDC_INT64__)
typedef __int64_t     int64_t;
typedef __uint64_t    uint64_t;
#endif

Pravděpodobně STRICT_ANSI není definována. Vypadá to, že se jedná o chybu v Android kód v sys / types.h. Pokud STDC_INT64 není definováno, nebude definovat uint64_t takže nelze definovat u_int64_t. Možná, že skutečným řešením je mít sys / types.h modifikována tak, že má

#ifdef __BSD_VISIBLE
typedef unsigned char   u_char;
typedef unsigned short  u_short;
typedef unsigned int    u_int;
typedef unsigned long   u_long;

typedef uint32_t       u_int32_t;
typedef uint16_t       u_int16_t;
typedef uint8_t        u_int8_t;
$if defined(__STDC_INT64__)
typedef uint64_t       u_int64_t;
#endif
#endif

Máte-li tento problém odstranit, bude další chyba bude v cstring.h: 109

icu/source/common/cstring.h:109: error: 'int64_t' has not been declared

Pokud jste místo toho #define STDC_INT64 v běžném / Unicode / ptypes.h půjde výrazně dál, ale skončí

icu/source/common/ustrenum.cpp:118: error: must #include <typeinfo> before using typeid

s Více info zde: http://groups.google.com/group/android-ndk/browse_thread/thread/2ec9dc289d815ba3?pli=1 ale žádné reálné řešení

Odpovězeno 10/02/2012 v 08:09
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more