【发布时间】: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 toolchain 和 XDA 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 上可用已有一段时间了。
【问题讨论】:
-
你想出解决方案了吗?如果是这样,请告诉我。
-
不,很遗憾,我没有,但看起来需要做很多工作:unix.stackexchange.com/questions/163765/…
标签: android linux open-source android-ndk java-native-interface