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

Android 使用NDK編譯二進制文件並運行
本文介紹如何編譯能夠在Android平臺上運行的二進制可執行文件。
首先咱們,知道,Android是基於Linux的,而在Linux上,能夠執行二進制文件,那麼如何在Android上執行二進制文件呢?shell

使用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;
}

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

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

include $(CLEAR_VARS).net

LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.cblog

include $(BUILD_EXECUTABLE)

好,咱們來解釋一下這幾行代碼:開發

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

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是編譯系統提供的變量,告訴編譯器編譯成二進制文件。

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,而後執行 咱們發現,執行成功了! ———————————————— 轉載 https://blog.csdn.net/u014088294/article/details/49924967

相關文章
相關標籤/搜索