Android NDK 中的 ICU 库

2023-11-29

我正在尝试为依赖于 ICU 库(libicuuc.so 和 libicui18n.so)的 C 库创建 JNI 包装器。

我尝试在 NDK(标准版本和 CrystaX 版本,在 Mac OS X 机器上)中构建 ICU4C,并不断遇到如下链接问题:

/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

我也尝试了给出的建议android ndk 中的 unicode 支持但没有运气。我被困在:

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

任何帮助,将不胜感激。


看来这个问题涉及到两个文件。 icu/source/common/unicode/ptypes.h 调用 sys/types.h 包括

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

通过包含 Android 中的 sys/types.h,我们涉及(第 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

看来uint64_t在赋值给u_int64_t时还没有声明。事实上,sys/types.h 包含 stdint.h,它具有以下内容:

#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

Likely 严格_ANSI没有定义。看起来这是 sys/types.h 中 Android 代码中的一个错误。如果STDC_INT64没有定义,它不会定义uint64_t,所以它不能定义u_int64_t。也许真正的解决方案是修改 sys/types.h 以便它具有

#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

如果修复此问题,下一个错误将出现在 cstring.h:109 中

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

如果你改为#defineSTDC_INT64在 common/unicode/ptypes.h 中,它将走得更远,但将结束于

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

更多信息请参见此处:http://groups.google.com/group/android-ndk/browse_thread/thread/2ec9dc289d815ba3?pli=1但没有真正的解决方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android NDK 中的 ICU 库 的相关文章

  • Android WebRTC 自定义捕获器

    我已经编译了 webRTC 演示应用程序 我看到捕获帧是由VideoCaptureAndroid java与本机代码紧密耦合的文件 我需要添加将我自己的帧推送到 webRTC 库以在视频通道上发送的功能 我可以用 C NDK 或 Java
  • “:app:buildNative'。> execCommand == null!”在 Android Studio 中构建我的应用程序并使用 NDK 时。是什么原因造成的/我该如何进一步进行 TS?

    这是我尝试在 android studio 中构建我的 android 应用程序时遇到的错误 该应用程序正在使用 NDK 我认为这是导致问题的原因 我对 android studio 很陌生 处理这个问题已经有两周了 经过大量谷歌搜索后 我
  • Android Studio 与 ndk 和 googletest

    我正在尝试设置我的 CI 服务器以与 Android Studio 一起使用 我希望通过新的 UI 运行 NDK 的单元测试 我正在使用 GoogleTest 当我从命令行构建时 gcov 可以完美地实现代码覆盖率 我遇到的问题是 UI 中
  • Android Studio 14 原生开发 + CrystaX NDK

    我正在尝试将一个巨大的跨平台 C 11 iOS Android 应用程序项目迁移到 Android Studio 14 我使用 CrystaX NDK 进行 boost 和 C 14 他们网站的博客上有官方 Android Studio C
  • 这是 GCC 中的错误还是我的代码错误?

    我有这个C代码 int test signed char anim col if anim col gt 31 return 1 else if anim col lt 15 return 2 return 0 使用 Android NDK
  • Readelf 报告程序是共享库而不是可执行文件

    使用独立的 Android NDK r10e 工具链 使用 toolchain x86 clang3 6 开关构建 出现这种奇怪的行为 交叉编译的环境变量已设置在运行makefile之前 SYSROOT指向Android工具链位置 CXX等
  • NDK 对静态库中函数的未定义引用

    因此 我尝试在 Android 应用程序的本机代码上使用 libopus 我的 Android mk 文件如下所示 PLATFORM PREFIX opt android ext LOCAL PATH PLATFORM PREFIX lib
  • build.gradle 文件中的 abiFilters 属性是什么?

    我找到了关于什么的文档ABI https developer android com ndk guides abis html是 但我找不到任何有关 ndk abiFilters 属性的确切用途的文档 具体有几个问题 如果我设置该属性 列出
  • 如何在循环中正确释放jstring?

    我的应用程序需要使用jni 逻辑如下 void myJniFunc JNIEnv env jclass clazz jobjectArray items int count 10 struct MyObj myObjArray struct
  • 如何在Android项目中使用libffmpeg.so?

    我正在尝试在 Android 中创建一个屏幕录制应用程序 为此 我使用 FFmpeg 我已经创建了 libffmpeg so 文件 现在我想在 Android 项目中使用相同的方法来调用它的本机函数 我怎样才能做到这一点 本教程提供了有关此
  • 如何使用android ndk r9b为Android编译FFMPEG

    我想设计一个Android应用程序 可以通过FFMPEG命令播放和编辑视频 但我不知道如何在Android上使用FFMPEG 我尝试过从Google搜索到的许多方法 但它们太旧了 无法实现 现在 FFMPEG的最新版本是2 1 1 Andr
  • 安装 OpenGL ES 并编译 Android 代码

    我刚刚开始在 android 上学习 OpenGL ES 使用这本书 https rads stackoverflow com amzn click com 1430226471 并遇到了采用的问题source http apress co
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • 使用 Android NDK r5b 链接静态库时出现问题 [重复]

    这个问题在这里已经有答案了 最近升级到 NDK r5b 构建失败 并出现对静态库中函数的 未定义引用 这是错误 home brian workspace VoiceEngineDemo obj local armeabi v7a objs
  • android ndk 多点触控?

    我正在编写一个仅使用本机代码的应用程序 那么ndk中是否可以获取多点触控事件呢 我感觉我已经搜索了整个网络 但什么也没找到 有谁知道如何做到这一点 是的 您可以检查名为native activity查看如何获取输入事件 寻找engine h
  • 使用 NDK 构建具有适用于 Android 的 cmake 构建文件的 C++ 项目

    我必须构建 2 个独立的 C 项目 它们具有针对不同平台的 Cmake 构建文件设置 我想使用 NDK 为 Android 构建它们 以便我可以将它们用作 Android Studio 中的预构建库 如何使用 NDK 为 Android 构
  • 如何强制从本机代码打开 Android 软键盘?

    我有一个游戏 当用户触摸屏幕时 它使用从 C 到 Java 的回调来强制打开软键盘 Java代码很简单是这样的 this inputMethodManager toggleSoftInput InputMethodManager SHOW
  • 使用 OpenSL ES Android 同时播放多种音效

    我正在使用 OpenSL ES 在我的项目中播放音乐和声音 我用过原生音频样本作为开始 它可以很好地再现背景音乐和单个声音 但是当我尝试同时再现两个或多个声音时 声音不会同时再现 因为当播放所有先前的缓冲区时 声音缓冲区会排队等待播放 然后
  • 从 NDK 获取应用程序名称

    我需要从本机端获取我的 Android 应用程序的名称 如下所示 android content context context android content context this current activiy Resources
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI

随机推荐

  • 我是否错误地实现了 IntoIterator 以引用 LazyList 实现,或者这是一个 Rust bug?

    在实现 LazyList 的一个版本 一个不可变的延迟计算的记忆单链表 就像 Haskell 列表 时 我遇到了实现的问题IntoIterator因为当我认为应该删除引用时 代码不会删除引用 以下代码已被简化 只是为了显示问题 因此 它不是
  • 在 C# 中形成参数化 SQL 语句的正确方法是什么

    客观的 使用 C 和 SQL2008 正确设置参数化 SQL Insert 语句 Issue 以下语句在 for 循环中使用 因此必须清除这些值 运行此代码后 它指出在 250 附近存在语法错误 代码如下 for int i 0 i lt
  • Spring Kafka - 手动确认

    我有一个 spring boot 应用程序 它监听 Kafka 流并将记录发送到某个服务以进行进一步处理 该服务有时可能会失败 注释中提到了异常情况 目前 我已经自己模拟了服务成功和异常的场景 监听器代码 Autowired PlanitS
  • 在 CSS 中选择子级的父级

    通过下面的代码 我希望能够将 CSS 样式应用于父级li class parent 列表中的项目 但仅当用户将鼠标悬停在孩子上方时li class child 该特定父母的物品 据我了解 仅使用 CSS 是不可能的 但是有人知道潜在的 Ja
  • 如何创建 javascript 执行器以使元素在 selenium webdriver 中可见

    目前正在研究 selenium webdriver 我有很多下拉菜单 例如可视化 周期 类型等 下拉菜单中有很多选项 我想从下拉列表中选择一个选项 我的目标是通过 ID 查找元素 但在 HTML 标记中 该元素不可见 无法选择该选项 我验证
  • RMI 多客户端

    RMI 本身可以处理多个客户端吗 IE 多个客户端可以同时使用服务器功能吗 如果不是 我该怎么做这样的事情 如果是 它是如何运作的 它是否为每个线程创建一个新线程call 如果一个客户端阻止该功能 下一个客户端会发生什么 ETC yes 怎
  • Word 2015 中的公式代码 [mac]

    我目前正在用word制作发票模板 但我正在与所使用的公式代码作斗争 Currently this is my table 但是 行数将取决于我工作的天数 现在 如果我创建更多行 我必须手动更改代码来编辑单元格引用 d9 b10 c10 有没
  • 如何使用 Yocto 修改 rootfs 配置文件?

    我正在使用 Thud 2 6 我想清除 etc default dropbear 的内容 ROOTFS POSTPROCESS COMMAND看起来很有希望 但以下未能创建空文件 没有错误 该配方完成的其他工作成功 SRC URI file
  • 看似相同的输入数据到 string[] 的神秘不同转换

    在调查一些问题时 我发现原因是看似相同的输入数据对 string 的意外不同转换 即 在下面的代码中 两个命令都返回相同的两项 File1 txt 和 File2 txt 但是转换为 string 会给出不同的结果 请参阅注释 有什么想法吗
  • 全局定义的位置:相对于页面容器是一个好的实践吗?

    我的应用程序有多个页面 每个页面都有一个顶级 page container 对于页面容器的相对定位设置存在争议 我的理解是所有内容都是相对于页面容器的 有什么想法吗 示例如下 page container position relative
  • 如何检查输入的日期是否等于今天的日期?

    我有一个 id 为 date trans 的表单输入 该日期输入的格式 经过服务器端验证 可以是以下任意一种 日 月 年 年 月 日 年 月 日 年 月 日 但是 在发布表单之前 我想检查 date trans 字段的日期是否等于今天的日期
  • 正则表达式仅匹配公共 IPv4 地址

    起初 我认为很容易找到只匹配互联网上公共 IPv4 地址的正则表达式 然而 经过大量的谷歌搜索 我什么也没得到 所以我尝试 编写正则表达式 如下 Perl 风格 0 9 0 9 1 3 2 0 9 1 3 1 1 9 0 9 1 3 2 0
  • BottomSheetBehavior - 只允许拖动视图的一部分

    我有一个使用 CoordinatorLayout 中的 BottomSheetBehavior 实现的底部工作表 我的 BottomSheet 有一个顶部应用栏标题栏 然后是一些可滚动的内容 像这样的东西
  • 使用 Windows api 读取应用程序的当前安装版本

    我试图使用 Windows api 来查找已安装应用程序的版本信息 我使用升级代码通过 MsiEnumRelatedProducts api 查找产品代码 但是当我尝试使用产品代码使用 MsiGetProductInfo 时 版本信息返回为
  • 检查 docx 是否损坏

    我尝试了很多解决方案 但代码总是检查损坏的文件并发送 true using FileStream fileStream File OpenRead path 0 MemoryStream memStream new MemoryStream
  • 为什么 CMD 转义字符有魔力而不是转义换行符

    我尝试执行简单的脚本 set list a b c echo list 输出是 a b a b 虽然我预计它是 a b c 引号似乎破坏了一切 因为如果 b 没有引号 则一切正常 我也很奇怪为什么它只在第二条新线转义时中断 那么 为什么输出
  • 如何在VS2013中隐藏引用计数?

    Visual Studio 2013 引入了一项新功能 它可以显示每种方法的使用次数 我觉得它不是很有用 而且它弄乱了我的文件间距 我如何禁用它 似乎找不到这个选项 我猜您可能正在运行 VS2013 Ultimate 的预览版 因为它没有出
  • 将 *array 分配给指针

    以下内容摘自Harbinson Steele C 参考手册 第五版 根据书中的两个作业p是等价的 7 5 6 地址运算符 int a 10 p p a p a 然而 根据 C faq问题 6 12 a是指针类型int然而 a是指向数组的指针
  • 无法将 macOS-arm64 的库与 macOS-arm64 的可执行文件链接

    I have some trouble with creating a build system on a Monterey M1 MacBook 到目前为止 我有一个可用的 Makefile 来构建和链接库 简化 g c所有 cpp 文件
  • Android NDK 中的 ICU 库

    我正在尝试为依赖于 ICU 库 libicuuc so 和 libicui18n so 的 C 库创建 JNI 包装器 我尝试在 NDK 标准版本和 CrystaX 版本 在 Mac OS X 机器上 中构建 ICU4C 并不断遇到如下链接