Android 使用NDK編譯二進制文件並運行

Android 使用NDK編譯二進制文件並運行

本文介紹如何編譯可以在Android平臺上運行的二進制可執行文件。
首先我們,知道,Android是基於Linux的,而在Linux上,可以執行二進制文件,那麼如何在Android上執行二進制文件呢?

使用NDK編譯

如果你已經下載了NDK,並且將其添加進環境變量,可以這樣編譯二進制文件。

首先新建一個HelloWorld文件夾,在其內部建立一個子文件夾jni,
jni包含3個文件夾,hello.c,Android.mk,Application.mk
1. hello.c 代碼如下

#include <stdio.h>
int main(void){
    printf("Hello World!\n");
    return 0;
}

代碼很簡單,就是輸出一句話

  1. Android.mk文件
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c

include $(BUILD_EXECUTABLE)

好,我們來解釋一下這幾行代碼:

LOCAL_PATH := $(call my-dir)
一個Android.mk file首先必須定義好LOCAL_PATH變量。它用於在開發樹中查找源文件。在這個例子中,宏函數my-dir, 由編譯系統提供,用於返回當前路徑(即包含Android.mk file文件的目錄)。

include $( CLEAR_VARS)
CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE爲你清除許多LOCAL_XXX變量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等…),除LOCAL_PATH 。這是必要的,因爲所有的編譯控制文件都在同一個GNU MAKE執行環境中,所有的變量都是全局的。

LOCAL_MODULE := hello
LOCAL_MODULE變量必須定義,以標識你在Android.mk文件中描述的每個模塊。

LOCAL_SRC_FILES := hell.c

LOCAL_SRC_FILES變量必須包含將要編譯打包進模塊中的C或C++源代碼文件。注意,你不用在這裏列出頭文件和包含文件,因爲編譯系統將會自動爲你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好

include $(BUILD_EXECUTABLE)

BUILD_EXECUTABLE是編譯系統提供的變量,告訴編譯器編譯成二進制文件。

  1. Application.mk文件
APP_ABI := all

該指令的意思是,對所有的硬件結構(arm,x86等),都編譯一個可執行文件。
然後我們在cmd,切換到HelloWorld目錄下,執行ndk-build編譯,
這裏寫圖片描述
我們發現編譯成功後,Hello World目錄下多了一個libs目錄,這個就是我們可執行二進制文件的目錄啦,我們打開,發現裏面有很多子目錄,
這裏寫圖片描述
這是因爲,我們在Application.mk文件中,指定所有的架構都要編譯,我們根據自己手機的架構(我的是armv7架構),將其目錄下的hello文件,通過adb push命令複製到手機上,

adb push hello /data/local/tmp

注意,Android的有些目錄是無法執行二進制文件的,所以一般放在/data/local/tmp目錄中。

Android手機上執行二進制文件

上一步,我們已經把二進制文件hello複製到手機上,我們來測試,其是否能在手機上運行。
通過adb shell進入手機shell模式,
然後切換到/data/local/tmp目錄,
執行ls命令,查看是否存在hello文件,若不存在,請確保上述步驟正確。
若存在,我們執行該文件
這裏寫圖片描述
然而,卻提示我們無法執行,怎麼回事?
別急,我們用ls -l hello命令來查看hello的詳細信息,
這裏寫圖片描述
我們發現hello是沒有可執行權限的(關於權限不懂,請自行百度Linux權限),我們通過chmod命令來修改其權限,chmod 751 hello,然後執行
這裏寫圖片描述
我們發現,執行成功了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章