Android.mk 為 android ndk project 必備的描述檔,為 GNU Makefile 格式。

它的位置必須在jni目錄中,主要是說明如何build source 和 shared libraries。
在 /ndk的根目錄/build/core/ 底下還有許多mk檔可以參考。
以下為 HelloJni(/android-ndk/samples/HelloJni) 的 Android.mk

# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)

首先#開頭的都為註解。
第15行規定為每個 Android.mk 起始行,不可替換成別的內容,其中 my-dir 為指出目前的路徑,也就是jni目錄的路徑。
第17行 CLEAR_VARS 會連結到 /ndk的根目錄/build/core/clear-vars.mk。
目的是清除所有除了LOCAL_PATH以外的 LOCAL_XXX 的變數,e.g. LOCAL_MODULE , LOCAL_SRC_FILES 等等。
Android.mk 在每一次的執行過程中可能會建立多個module,因為以LOCAL_ 開頭的都是全域變數,為了避免module之間的衝突,必須清除掉。
第19行為命名 module 的名稱,系統自動會加上前綴lib 以及後綴.so,最後會產生一個共享庫文件.so ,並名為 libhello-jni.so
第20行為用來建立這個module的來源檔,若有多個檔案,必須以空格分開。
第22行 BUILD_SHARED_LIBRARY 會連結到 /ndk的根目錄/build/core/build-shared-library.mk。
目的是將來源檔案轉換為共享庫文件的動作,其完整動作會描述在build-shared-library.mk 。
 

如何藉由 Android.mk 編譯 c/c++檔案:

1.開啟 Terminal,並移動到專案根目錄中。
2.呼叫 ndk-build,Terminal 輸入 ndk-build 絕對路徑(/path_of_android_ndk/ndk-build)。
3.編譯成功輸出

Android NDK: WARNING: APP_PLATFORM android-8 is larger than android:minSdkVersion 3 in ./AndroidManifest.xml
[arm64-v8a] Gdbserver      : [aarch64-linux-android-4.9] libs/arm64-v8a/gdbserver
[arm64-v8a] Gdbsetup       : libs/arm64-v8a/gdb.setup
[x86_64] Gdbserver      : [x86_64-4.9] libs/x86_64/gdbserver
[x86_64] Gdbsetup       : libs/x86_64/gdb.setup
[mips64] Gdbserver      : [mips64el-linux-android-4.9] libs/mips64/gdbserver
[mips64] Gdbsetup       : libs/mips64/gdb.setup
[armeabi-v7a] Gdbserver      : [arm-linux-androideabi-4.8] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup       : libs/armeabi-v7a/gdb.setup
[armeabi] Gdbserver      : [arm-linux-androideabi-4.8] libs/armeabi/gdbserver
[armeabi] Gdbsetup       : libs/armeabi/gdb.setup
[x86] Gdbserver      : [x86-4.8] libs/x86/gdbserver
[x86] Gdbsetup       : libs/x86/gdb.setup
[mips] Gdbserver      : [mipsel-linux-android-4.8] libs/mips/gdbserver
[mips] Gdbsetup       : libs/mips/gdb.setup
[arm64-v8a] Install        : libhello-jni.so => libs/arm64-v8a/libhello-jni.so
[x86_64] Install        : libhello-jni.so => libs/x86_64/libhello-jni.so
[mips64] Install        : libhello-jni.so => libs/mips64/libhello-jni.so
[armeabi-v7a] Install        : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so
[armeabi] Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
[x86] Install        : libhello-jni.so => libs/x86/libhello-jni.so
[mips] Install        : libhello-jni.so => libs/mips/libhello-jni.so
➜

編譯成功後在專案根目錄會多出 obj , libs 資料夾,.so會產生在libs資料夾內。
 
進階用法:
1.建立多個共享庫文件。

LOCAL_PATH := $(call my-dir)
#第1個模組
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
#第2個模組
include $(CLEAR_VARS)
LOCAL_MODULE    := module2
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)

 
2. 建立靜態函式庫。
可將第3方的模組轉換為靜態函式庫,並加到原始函式庫上

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := third_party_lib
LOCAL_SRC_FILES := third.c
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE    := module
LOCAL_SRC_FILES := module.c
LOCAL_STATIC_LIBRARIES := third_party_lib
include $(BUILD_SHARED_LIBRARY)

 
3.多個模組使用同一個靜態函式庫

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := third_party_lib
LOCAL_SRC_FILES := third.c
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE    := module1
LOCAL_SRC_FILES := module.c
LOCAL_STATIC_LIBRARIES := third_party_lib
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE    := module2
LOCAL_SRC_FILES := module2.c
LOCAL_STATIC_LIBRARIES := third_party_lib
include $(BUILD_SHARED_LIBRARY)

參考官網:https://developer.android.com/ndk/guides/android_mk.html#over

Application.mk 為描述應用程序需要哪些模組,也定義模組間的通用變數,必須位於 jni 目錄。

以下為 HelloJni 的 Application.mk

APP_ABI := all

APP_ABI 表示平台,而 all 代表為所有支援的平台建立二建制文件。
參考官網:https://developer.android.com/ndk/guides/application_mk.html