【问题标题】:Building against GLIBC for an NDK library针对 GLIBC 构建 NDK 库
【发布时间】:2012-01-11 15:45:31
【问题描述】:

我有兴趣构建一个开源项目,它需要 GNU 库 GLIBC 和 GLIBM。如果我要在 Linux 下(我使用 Ubuntu 11.10 作为主机)交叉编译它以获得共享(.so),甚至是静态(.a)对象,使用 ARMv7-a 霓虹灯架构,使用 API-9 ,作为与 Java 的 JNI 一起调用的库,最终编译为 APK 以进行分发,要采取哪些步骤来实现这一结果?

鉴于我已经尝试过 Google NDK 工具链(根据文档设置 $PATH 和 $CC 的简单方法),各种自定义工具链 Code Sourcery toolchainXDA forum using crosstool-ng 上建议的工具链是是否有可能实现一个可以从 JNI 调用的共享对象文件,并且可以访问非根 Android 设备上的完整 GLIBC 库?

我已经搜索了这个问题的答案,我最接近的是在本地构建 GLIBC 和 GLIBM,并使用 NDK 的 arm-linux-androideabi-ld 手动复制相关对象 (.o) 文件和链接。当使用 Java 的 System.LoadLibarary() 调用库时,来自 Crosstool-ng 和 CodeSourcery 的 libc.so.6 文件将无法工作,因为重定位失败(给出错误未知的 reloc 类型 19)。我对重定位的了解不是最好的,但根据我所读到的内容,这需要更改 /linux/elf.h 头文件,但我不确定从那里去哪里。

我相信根据我所读到的内容,可以制作一个静态可执行文件,在链接时解决所有依赖项,但据我所知,不可能将其打包为 APK 文件。

当然,我不可能是第一个想要针对 Android 平台的 Bionic 以外的东西编译 C 代码的人吗?有很多 C 项目可以移植到 Android 上,显然 GLIBC 在 iPhone 上可用已有一段时间了。

【问题讨论】:

标签: android linux open-source android-ndk java-native-interface


【解决方案1】:

任何低级 C 库都与操作系统本身有着非常紧密的联系。虽然 Linux 和 Android 可能大部分是相同的东西,但它们不是。针对另一个 C 库构建将需要先移植该 C 库。

【讨论】:

  • 而且,在大多数情况下,将应用程序移植到不同的“标准”C 库比移植 C 库本身要容易得多。
  • 嗯,那篇文章是关于 glib 的,而不是 glibc。我希望 glib 可以直接移植,因为它或多或少是一个普通的库。
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 2019-11-16
  • 1970-01-01
  • 2012-07-25
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多