Android基于Linux内核,据我所知,静态链接的ELF二进制文件只需要内核即可运行。虽然Android没有包含glibc,但系统调用接口应该仍然存在,被构建到内核中。我知道任何实际应用在静态链接时都会非常庞大,但这只是假设。它能工作吗?
Android基于Linux内核,据我所知,静态链接的ELF二进制文件只需要内核即可运行。虽然Android没有包含glibc,但系统调用接口应该仍然存在,被构建到内核中。我知道任何实际应用在静态链接时都会非常庞大,但这只是假设。它能工作吗?
我猜你想做的是在Linux机器上获取一些静态库,并将它们与自己的目标文件静态链接,以尝试解决它们在Android上缺失的问题。但问题在于两台机器几乎肯定不使用相同的CPU架构,因此这些库并不是为Android构建的,机器代码也无法被Android“理解”。理论上,你需要交叉编译这些库,并将程序与其链接。
然而,Android已经有一个名为Bionic的标准C库。它取代了Android上的glibc。
在 Android 上进行本地开发时,通常需要创建本地的.so库,并为每种支持的架构(arm
、arm64
、mips
、x86
、x86_64
)进行交叉编译。这些库可以通过JNI调用在 APK 中被加载引用。
虽然您可以使用 ELF 二进制文件(.so 文件是使用标准编译器如 gcc 制作的),但您需要为希望在应用程序上运行的每个目标架构准备一个库文件。
此外,虽然 Android 可以加载 x86
或 arm 版本的 .so 文件,但对于 x86_64
和 arm64
来说,建议您创建所有 4 个版本(如果您正在支持四种架构)。原生库将根据文件夹结构进行加载。
示例:一个 arm46
系统将仅在不存在 lib/arm64
的情况下从 lib/arm
加载 arm .so 文件。结果是,任何包含 lib/arm64 的库都会导致您的应用在 arm64
系统上崩溃,除非您同时包含 arm
和 arm64
版本。