我有兴趣构建一个开源项目,它需要GNU库GLIBC和GLIBM。如果我在Linux(我使用Ubuntu 11.10作为主机)下交叉编译共享(.so),甚至是静态(.a)对象,使用ARMv7-a neon架构,使用API-9 ,作为使用Java的JNI调用的库,最终编译为APK以进行分发,将采取哪些步骤来实现此结果?
鉴于我已经尝试了Google NDK工具链(根据文档设置了$ PATH和$ CC的简单方法),Code Sourcery toolchain和{{3}上建议的各种自定义工具链XDA forum using crosstool-ng和工具链是否有可能实现一个可以从JNI调用的共享对象文件,并且可以访问非root用户Android设备上的完整GLIBC库?
我已经找到了答案,我最接近的是在本地构建GLIBC和GLIBM并复制相关对象(.o)文件并使用NDK的arm-linux-androideabi-ld手动链接。当使用Java的System.LoadLibarary()调用库时,Crosstool-ng和CodeSourcery中的libc.so.6文件将无法正常工作,因为重定位失败(给出错误未知的reloc类型19)。我对重定位的了解并不是最好的,但是根据我的内容,这需要更改/linux/elf.h头文件,但我不确定从那里开始的确切位置。
我相信从我所读到的内容可能会创建一个静态可执行文件,在链接时解析了所有依赖项,但就我所知,将其打包为APK文件是不可能的。< / p>
当然,我不能成为第一个想要针对Android平台的Bionic以外的东西编译C代码的人吗?有很多C项目可以移植到Android上,显然GLIBC已经在iPhone上可用了很长一段时间。
答案 0 :(得分:2)
任何低级C库与操作系统本身都有很紧密的联系。虽然Linux和Android可能主要是是相同的,但它们不是。针对另一个C库构建将需要首先移植所述C库。