NDK 開發中,核心邏輯常打包為 .so 供 Java 層呼叫;但當共享庫依賴複雜、需獨立除錯時,編譯為可執行檔在真機/模擬器跑測試更直觀。本文記錄 Ubuntu 12.04 + NDK r8c 環境下的完整流程與常見坑。
samples/hello-jni 為基礎,刪除 AndroidManifest.xml(純 C 程式不需)。jni/Android.mk:include $(BUILD_SHARED_LIBRARY) → include $(BUILD_EXECUTABLE)LOCAL_MODULE 與 LOCAL_SRC_FILES 對應源檔名(如 helloworld.c)。main():#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World\n");
return 0;
}
執行 ndk-build,產出 obj/local/armeabi/helloworld(或對應 ABI 目錄)。
# 1. 確認設備連線 adb devices # 2. 建立目錄並推送 adb shell mkdir /data/helloworld adb push obj/local/armeabi/helloworld /data/helloworld/ # 3. 進入 shell 賦予執行權限並執行 adb shell chmod 777 /data/helloworld/helloworld /data/helloworld/helloworld # 輸出: Hello World exit
若有相依 .so,同步推送至:
/data/data/<pkg>/lib/(一般 App)/system/lib/plugins/<pkg>/(系統 App)Read-only file system 推送 /system/lib 失敗adb remount adb shell chmod 777 /system chmod 777 /system/lib
部分設備需解鎖 bootloader 或使用 magisk 獲得寫入權限。
error: only position independent executables (PIE) are supported(Android 5.0+)在 Android.mk 加入:
LOCAL_CFLAGS += -fPIE LOCAL_LDFLAGS += -fPIE -pie
設定 LD_LIBRARY_PATH 或用 patchelf --set-rpath 指定 .so 搜尋路徑。