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