Android 的內核是 Linux,因此 Android 應該可以運行 Linux 程序。
舉個例子
#include <unistd.h> int main() { write(1, "Hello World!\n", 13); }
如果我們不用 NDK 而是用 Linux 的編譯器來編譯,就會生成一個 Linux 程序
aarch64-linux-gnu-gcc-10 hello.c -o hello.elf
直接在 Android 中運行 hello.elf 肯定會報錯,原因有兩個:首先 Android 的 interpreter 是 /system/bin/linker64 而 Linux 的 interpreter 是 ld-linux-aarch64.so.1,其次 Android 鏈接的 libc.so 和 Linux 的 libc.so 也不同。
所以我們首先要把 ld-linux-aarch64.so.1 和 libc.so.6 復制到 Android,在這個例子中我把它們復制到了 /data/local/tmp 目錄。然后為了讓操作系統能夠找到它們,我們需要對生成的 Linux 程序進行一點修改。
我們需要用到 patchelf(https://github.com/NixOS/patchelf) 這個工具。
patchelf --set-interpreter /data/local/tmp/ld-linux-aarch64.so.1 ./hello.elf patchelf --set-rpath /data/local/tmp ./hello.elf
修改完成后就可以在 Android 中運行這個程序了。