概述
在Eclipse的時代背蟆,我們進行NDK的開發(fā)一般需要通過手動執(zhí)行NDK腳 本生成*.so文件,再將.so文件放到對應(yīng)的目錄之后,之后再進行打 包。
AS + Gradle的NDK開發(fā)
不需要再去通過javah根據(jù)java文件生成頭文件创肥,并根據(jù)頭 文件生成的函數(shù)聲明編寫cpp文件 當(dāng)在Java文件中定義完native接口,可以在cpp文件中自動 生成對應(yīng)的native函數(shù),所需要做的只是補全函數(shù)體中的內(nèi) 容 不需要手動執(zhí)行ndk-build命令得到so瓤的,再將so拷貝到對應(yīng) 的目錄
在編寫cpp文件的過程中,可以有提示了
預(yù)覽系統(tǒng)帶有的庫支持
可以到我們的ndk工具目錄
build/cmake/system_libs.cmake
里面查看系統(tǒng)支持的庫吞歼,加入到對應(yīng)的程序cmake 清單
創(chuàng)建支持C/C++的項目
安裝組件
NDK 圈膏,CMake, LLDB
創(chuàng)建工程
C++ Standard:選擇C++的標(biāo)準(zhǔn)篙骡,Toolchain Default表示使用默認的 CMake配置稽坤,這里我們選擇默認。
Excptions Support:如果您希望啟用對C++異常處理的支持糯俗,請選中 此復(fù)選框尿褪。如果啟用此復(fù)選框,Android Studio會將-fexceptions標(biāo)志 添加到模塊級 build.gradle文件的cppFlags中得湘,Gradle會將其傳遞到 CMake杖玲。
Runtime Type information Support:如果您希望支持RTTI,請選中 此復(fù)選框淘正。如果啟用此復(fù)選框摆马,Android Studio會將-frtti標(biāo)志添加到 模塊級 build.gradle文件的cppFlags中,Gradle會將其傳遞到CMake
cpp 文件夾
用于存放C/C++的源文件鸿吆,在磁盤上對應(yīng)于app/src/main/cpp文件夾囤采,當(dāng)新建工 程時,它會生成一個native-lib.cpp的事例文件
增加 CMakeList.txt 腳本
構(gòu)建腳本惩淳,在磁盤上對應(yīng)于app/目錄下的txt文件蕉毯,其內(nèi)容為如下圖所示,這里 面涉及到的CMake語法包括下面四種思犁,關(guān)于CMake的語法代虾,可以查看 官方的 API 說明
cmake_minimum_required
add_library
find_library
target_link_libraries
build.gradle 腳本
android { ...
externalNativeBuild {
cmake {
cppFlags "" }
} }
buildTypes { ...
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
} }
}
加載so庫
static {
System.loadLibrary("native-lib");
}
步驟原理
- 首先,在構(gòu)建時抒倚,通過build.gradle中path所指定的路徑褐着,找到 CMakeList.txt,解析其中的內(nèi)容托呕。
- 按照腳本中的命令含蓉,將src/main/cpp/native-lib.cpp編譯到共享的對象 庫中,并將其命名為libnative-lib.so项郊,隨后打包到APK中馅扣。
- 當(dāng)應(yīng)用運行時,首先會執(zhí)行MainActivity的static代碼塊的內(nèi)容着降,使用 System.loadLibrary()加載原生庫差油。
- 在onCreate()函數(shù)中,調(diào)用原生庫的函數(shù)得到字符串并展示
在現(xiàn)有的項目中添加C/C++代碼
創(chuàng)建一個Android 工程
定義native 接口
定義cpp文件
在模塊根目錄下的src/main/新建一個文件夾cpp,在其中新增一個cpp文件
定義CMakeLists.txt
在模塊根目錄下新建一個CMakeLists.txt文件
在build.gradle中進行配置
- 我們需要讓Gradle腳本確定CMakeLists.txt所在的位置蓄喇,我們可以在 CMakeLists.txt上點擊右鍵发侵,之后選擇Link C++ Project with Gradle
- 要手動配置 Gradle 以關(guān)聯(lián)到我們的原生庫,我們需要將 externalNativeBuild {} 塊添加到 模塊(組件)級 build.gradle 文件 中妆偏,并使用 cmake {} 或 ndkBuild {} 對其進行配置:
android {
...
defaultConfig {...}
buildTypes {...}
// 封裝您的外部本地構(gòu)建配置.
externalNativeBuild {
// 封裝您的 CMake 構(gòu)建配置.
cmake {
// 為CMake 構(gòu)建腳本提供一個相對路徑(這個相對路徑是相對于當(dāng)前 build.gradle的路徑).
path "CMakeLists.txt"
}
}
}
- 指定可選配置
我們可以在 模塊(組件)級 build.gradle 文件的 defaultCong {} 塊中配置另一個 externalNativeBuild {} 塊刃鳄,為 CMake 或 ndk-build 指定可選參數(shù)和標(biāo)志。與 defaultCong {} 塊中的其他屬性類似钱骂,我們也可以在構(gòu)建配置中為每個產(chǎn)品風(fēng) 味(productFlavors )重寫這些屬性叔锐。
例如,如果我們的 CMake 或 ndk-build 項目定義多個原生庫见秽,我們可以使用 targets 屬性僅為給定產(chǎn)品風(fēng)味(productFlavors )構(gòu)建和打包這些庫中的一部 分愉烙。以下代碼示例說明了我們可以配置的部分屬性:
android { ...
defaultConfig { ...
// 這個代碼塊不同于我們關(guān)聯(lián)到Gradle的CMake或ndk構(gòu)建腳本的那個 塊.
externalNativeBuild {
// For ndk-build, instead use ndkBuild {} // 用于配置Cmake構(gòu)建參數(shù)
cmake {
// 將參數(shù)傳遞給變量時,請使用以下語法:
// arguments "-DVAR_NAME=ARGUMENT". arguments "-DANDROID_ARM_NEON=TRUE",
// 如果要將多個參數(shù)傳遞給變量, 使用以下語法一起傳遞: // arguments "-DVAR_NAME=ARG_1 ARG_2"
// 下面一行將 'rtti' 和 'exceptions' 傳遞給
'ANDROID_CPP_FEATURES'.
"-DANDROID_CPP_FEATURES=rtti exceptions"
arguments "-DANDROID_ARM_NEON=TRUE", "- DANDROID_TOOLCHAIN=clang"
// 為C編譯器設(shè)置可選標(biāo)志.
cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"
// 設(shè)置一個標(biāo)志使C++編譯器的format宏常量 生效.
cppFlags "-D__STDC_FORMAT_MACROS" }
} }
buildTypes {...}
productFlavors { ...
demo { ...
externalNativeBuild {
cmake {
...
// 為這個product flavor 指定要構(gòu)建和打包的本地庫解取,如果 您不配置這個屬性步责,
// Gradle 將構(gòu)建和打包所有您在CMake 或 ndk-build項目 中定義的共享對象庫
targets "native-lib-demo" }
} }
pad {
...
externalNativeBuild {
cmake {
...
targets "native-lib-pad" }
} }
}
// 使用下面的代碼塊鏈接Gradle到我們的CMake或ndk-build腳本 externalNativeBuild {
cmake {...}
// or ndkBuild {...} }
}
CMake部分構(gòu)建變量列表:
變量名 | 參數(shù) | 描述 |
---|---|---|
ANDROID_TOOLCHAIN | clang(默認) | 指定CMake應(yīng) 該使用的編譯 器工具鏈 |
ANDROID_PLATFORM | android-19 | 指定Android的 目標(biāo)平臺 |
ANDROID_CPP_FEATURES | 默認為空,可配置:rtti(RunTime Type Information):運行時類型信息exceptions: 指示代碼使用C++異 常 | 指定CMake編譯時需要某些C++特性 |
ANDROID_ARM_MODE | thumb(默認) arm | 指定是arm還 是以thumb模 式生成ARM目標(biāo)二進制庫 |
CMake構(gòu)建命令
Android Studio在cmake_build_command.txt文件中保存用于執(zhí)行CMake構(gòu)建
的構(gòu)建參數(shù)禀苦。
Android Studio會為每個ABI和每個構(gòu)建類型創(chuàng)建cmake_build_command.txt勺择, 放置在如下目錄:
//.externalNativeBuild/cmake///
或者
.cxx/cmake/debug/{abi}/cmake///
不同 環(huán)境略有不同,可以查看build_command.txt
CMake構(gòu)建參數(shù)列表:
構(gòu)建參數(shù) | 描述 |
---|---|
-G | Android Gradle - Ninja是Android Studio唯一支持的C/C++構(gòu)建系 統(tǒng).CMake會生成 android_gradle_build.json文 件伦忠。 其中包含有關(guān)CMake構(gòu)建的 Gradle插件的元數(shù)據(jù)省核,例如編譯器標(biāo)志和目標(biāo)名稱。 |
- DANDROID_ABI | 目標(biāo)ABI |
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY | CMake生成的庫的位置 |
-DCMAKE_TOOLCHAIN_FILE | CMake用于交叉編譯的 android.toolchain.cmake文件的路徑 |
如果要顯示執(zhí)行構(gòu)建過程中的詳細信息昆码,比如為了得到更詳細的出錯信息气忠。
運行后
在 .cxx/cmake/debug/{abi}/build_output.txt 查 看log
# 開啟輸出詳細的編譯和鏈接信息
set(CMAKE_VERBOSE_MAKEFILE on)
message(STATUS "要打印的信息")
自定義變量
set(變量名 變量值)
常用變量
# 引用變量格式:${變量名}
# 工程的源文件目錄PROJECT_SOURCE_DIR
# CMakeList.txt文件所在的目錄CMAKE_SOURCE_DIR
ABI 是什么
ABI(Application binary interface)應(yīng)用程序二進制接口。不同的 CPU 與指令集的每種組合都有定義的 ABI (應(yīng)用程序二進制接口)赋咽,一 段程序只有遵循這個接口規(guī)范才能在該 CPU 上運行旧噪,所以同樣的程序 代碼為了兼容多個不同的CPU,需要為不同的 ABI 構(gòu)建不同的庫文
述描 數(shù)參建構(gòu)
件脓匿。當(dāng)然對于CPU來說淘钟,不同的架構(gòu)并不意味著一定互不兼容。
armeabi設(shè)備只兼容armeabi;
armeabi-v7a設(shè)備兼容armeabi-v7a陪毡、armeabi;
arm64-v8a設(shè)備兼容arm64-v8a米母、armeabi-v7a、armeabi;
X86設(shè)備兼容X86毡琉、armeabi;
X86_64設(shè)備兼容X86_64铁瞒、X86、armeabi;
mips64設(shè)備兼容mips64桅滋、mips;
mips只兼容mips;
- 指定 ABI 默認情況下慧耍,Gradle 會針對 NDK 支持的 ABI 將我們的原生 庫構(gòu)建到單獨的 .so 文件中,并將其全部打包到我們的 APK 中。如果 我們希望 Gradle 僅構(gòu)建和打包原生庫的特定 ABI 配置芍碧,我們可以在 模塊級 build.gradle 文件中使用 ndk.abiFilters 標(biāo)志指定這些配置煌珊,如 下所示:
android { ...
defaultConfig { ...
externalNativeBuild { cmake {...}
// or ndkBuild {...}
}
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with
your APK.
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-
v7a',
} }
buildTypes {...}
'arm64-v8a'
externalNativeBuild {...} }
在大多數(shù)情況下,我們只需要在 ndk {} 塊中指定 abiFilters(如上所示)泌豆,因為 它會指示 Gradle 構(gòu)建和打包原生庫的這些版本怪瓶。不過,如果我們希望控制 Gradle 應(yīng)當(dāng)構(gòu)建的配置践美,并獨立于我們希望其打包到 APK 中的配置,請在 defaultCong.externalNativeBuild.cmake{} 塊(或 defaultCong.externalNativeBuild.ndkBuild{} 塊中)配置另一個 abiFilters 標(biāo) 志找岖。Gradle 會構(gòu)建這些 ABI 配置陨倡,不過僅會打包我們在 defaultCong.ndk{} 塊 中指定的配置。
為了進一步降低 APK 的大小许布,請考慮 配置 ABI APK 拆分兴革,而不是創(chuàng)建一個包含 原生庫所有版本的大型 APK,Gradle 會為我們想要支持的每個 ABI 創(chuàng)建單獨的 APK蜜唾,并且僅打包每個 ABI 需要的文件杂曲。如果我們配置 ABI 拆分,但沒有像上 面的代碼示例一樣指定 abiFilters 標(biāo)志袁余,Gradle 會構(gòu)建原生庫的所有受支持 ABI 版本擎勘,不過僅會打包我們在 ABI 拆分配置中指定的版本。為了避免構(gòu)建我們不 想要的原生庫版本颖榜,請為 abiFilters 標(biāo)志和 ABI 拆分配置提供相同的 ABI 列表棚饵。
實現(xiàn)C++
JNIEXPORT和JNICALL:他們是JNI中定義的宏,可以再jni.h這個頭文件中找到
JNIEnv*:表示一個指向JNI環(huán)境的指針掩完,可以通過他訪問JNI提供的接口方法
JObject: 表示java對象中的this
編寫CMakeLists.txt腳本
Cmake常用命令
命令 | 含義 |
---|---|
cmake_minimum_required | 指定需要CMAKE的最小 版本 |
include_directories | 指定 原生代碼 或 so庫 的 頭文件路徑 |
add_library | 添加 源文件或庫 |
set_target_properties(<> PROPERTIES IMPORTED_LOCATION) | 指定 導(dǎo)入庫的路徑 |
set_target_properties(<> PROPERTIES LIBRARY_OUTPUT_DIRECTORY) | 指定生成的目標(biāo)庫的導(dǎo)出路徑 |
find_library | 添加NDK API |
target_link_libraries | 將預(yù)構(gòu)建庫關(guān)聯(lián)到原生庫 |
aux_source_directory | 查找在某個路徑下的所有 源文件 |
cmake_minimum_required用于指定CMake的最低版本信息噪漾,不加入會收到警 告。
cmake_minimum_required(VERSION 3.4.1)
從原生代碼構(gòu)建一個庫
我們通過add_library讓CMake根據(jù)native-lib.cpp源文件構(gòu)建一個名為native-lib 的共享庫
靜態(tài)庫:以.a結(jié)尾且蓬。靜態(tài)庫在程序鏈接的時候使用欣硼,鏈接器會將程序 中使用到函數(shù)的代碼從庫文件中拷貝到應(yīng)用程序中。一旦鏈接完成恶阴, 在執(zhí)行程序的時候就不需要靜態(tài)庫了诈胜。
共享庫:以.so結(jié)尾。在程序的鏈接時候并不像靜態(tài)庫那樣在拷貝使用 函數(shù)的代碼冯事,而只是作些標(biāo)記耘斩。然后在程序開始啟動運行的時候,動 態(tài)地加載所需模塊
add_library(
#第一個參數(shù)桅咆,決定了最終生成的共享庫的名字
native-lib #最終生成的so文件libnative-lib.so #第二個參數(shù)括授,我們可以指定根據(jù)源文件編譯出來的是靜態(tài)庫還是共
享庫,分別對應(yīng)STATIC/SHARED關(guān)鍵字 SHARED
#指定源文件 native-lib.cpp)
添加NDK API
在Android系統(tǒng)當(dāng)中,預(yù)制了一些標(biāo)準(zhǔn)的NDK庫荚虚,這些庫函數(shù)的目的就是讓開發(fā) 者能夠在原生方法中實現(xiàn)之前在Java層開發(fā)的一些功能
android-ndk-r20\build\cmake\system_libs.cmake
在CMakeLists.txt引入 Android NDK 的log庫
- find_library:將一個變量和Android NDK的某個庫建立關(guān)聯(lián)關(guān)系薛夜。該 函數(shù)的第二個參數(shù)為Android NDK中對應(yīng)的庫名稱,而調(diào)用該方法之 后版述,它就被和第一個參數(shù)所指定的變量關(guān)聯(lián)在一起梯澜。 在這種關(guān)聯(lián)建立 以后,我們就可以使用這個變量在構(gòu)建腳本的其它部分引用該變量所 關(guān)聯(lián)的NDK庫渴析。
- target_link_libraries:把NDK庫和我們自己的原生庫native-lib進行關(guān) 聯(lián)晚伙,這樣,我們就可以調(diào)用該NDK庫中的函數(shù)了
find_library(
# 定義路徑變量的名稱 并用這個變量存儲 NDK庫的位置俭茧。
log-lib
# 指定 CMake 需要定位的NDK庫的名稱
log)
# 將一個或多個 其他本地庫 鏈接到我們的本地庫上咆疗。 target_link_libraries(# 指定目標(biāo)庫(native-lib是我們自己創(chuàng)建的 原生庫).
native-lib
# 將日志庫鏈接到目標(biāo)庫.
${log-lib})
- NDK 還以源代碼的形式包含一些庫,我們在構(gòu)建和關(guān)聯(lián)到我們的原生 庫時需要使用這些代碼母债。我們可以使用 CMake 構(gòu)建腳本中的 add_library() 命令午磁,將源代碼編譯到原生庫中。要提供本地 NDK 庫的 路徑毡们,我們可以使用 ANDROID_NDK 路徑變量迅皇,Android Studio 會 自動為您定義此變量。以下命令可以指示 CMake 構(gòu)建 android_native_app_glue.c衙熔,后者會將 NativeActivity 生命周期事件 和觸摸輸入置于靜態(tài)庫中并將靜態(tài)庫關(guān)聯(lián)到 native-lib:
add_library( app-glue STATIC
${ANDROID_NDK}/sources/android/native_app_glue/android_nat ive_app_glue.c )
# 您需要將 靜態(tài)(STATIC)庫 與 共享(SHARED )的本地庫鏈接起來. target_link_libraries( native-lib
app-glue ${log-lib} )
- 在代碼中引入頭文件登颓,并調(diào)用Log函數(shù)
#include <android/log.h>
...
__android_log_write(ANDROID_LOG_DEBUG, tag, log);
...
引入第三方so庫
將so庫和頭文件拷貝到對應(yīng)目錄
/app/src/main/jniLibs/arm/libxxx.so
修改CMakeLists.txt文件
第三方so庫 這里和之前在第二步中介紹的創(chuàng)建一個新的原生庫類似, 區(qū)別在于最后一個參數(shù)红氯,我們通過IMPORTANT標(biāo)志告知CMake只希 望將庫導(dǎo)入到項目中挺据。
目標(biāo)庫的路徑 這里有幾點需要說明:
-- CMAKE_SOURCE_DIR}表示的是CMakeLists.txt所在的路徑,我們指 定第三方so所在路徑時脖隶,應(yīng)當(dāng)以這個常量為起點扁耐。我們應(yīng)當(dāng)為每種ABI接口提供單獨的軟件包,那么产阱,我們就可 以在jinLibs下建立多個文件夾婉称,每個文件夾對應(yīng)一種ABI接口類型, 之后再通過${ANDROID_ABI}來泛化這一層目錄的結(jié)構(gòu)构蹬,這樣將有助 于充分利用特定的CPU架構(gòu)王暗。
三方的庫關(guān)聯(lián)到原生庫 這里和將NDK庫關(guān)聯(lián)到原生庫的原理是一樣 的
為了確保 CMake 可以在編譯時定位 我們的 頭文件,我們需要將 include_directories() 命令添加到 CMake 構(gòu)建腳本中并指定頭文件路徑
add_library(
# 指定目標(biāo)導(dǎo)入庫.
imported-lib
# 設(shè)置導(dǎo)入庫的類型(靜態(tài)或動態(tài)) 為 shared library.
SHARED
# 告知 CMake imported-lib 是導(dǎo)入的庫
IMPORTED )
set_target_properties(
# 指定目標(biāo)導(dǎo)入庫
imported-lib
# 指定屬性(本地導(dǎo)入的已有庫)
PROPERTIES IMPORTED_LOCATION
# 指定你要導(dǎo)入庫的路徑.
# ${CMAKE_SOURCE_DIR}
imported-lib/src/${ANDROID_ABI}/libimported-lib.so )
#為了確保 CMake 可以在編譯時定位到我們的 頭文件庄敛,我們需要使用 include_directories() 命令俗壹,并包含 頭文件的路
include_directories( imported-lib/include/ )
#要將預(yù)構(gòu)建庫關(guān)聯(lián)到我們的原生庫,請將其添加到 CMake 構(gòu)建腳本的 target_link_libraries() 命令中
target_link_libraries( imported-lib和log-lib.
# 指定了三個庫藻烤,分別是native-lib绷雏、
native-lib
imported-lib
# log-lib是包含在 NDK 中的一個日志庫 ${log-lib} )
在代碼中引入第三方庫的頭文件头滔,調(diào)用函數(shù)
參考資料
首推 Android NDK 官方文檔,雖然很多都不完整涎显,但是絕對是必須看一遍的東 西坤检。
當(dāng)初次接觸 NDK 開發(fā)又覺得新建的 Hello World 項目過于簡單時。建議把 googlesamples - android-ndk 項目拉下來期吓。里面有多個實例參考早歇,比官方文檔 完整很多。
Q1 :怎么指定C++標(biāo)準(zhǔn)讨勤?
A:在 build_gradle 中箭跳,配置 cppFlags -std
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions -std=c++14"
arguments '-DANDROID_STL=c++_shared' }
}
Q2: add_library 如何編譯一個目錄中的所有源文件?
A: 使用 aux_source_directory 方法將路徑列表全部放到一個變量中潭千。
# 查找所有源碼 并拼接到路徑列表 aux_source_directory(${CMAKE_HOME_DIRECTORY}/src/api SRC_LIST) aux_source_directory(${CMAKE_HOME_DIRECTORY}/src/core CORE_SRC_LIST)
list(APPEND SRC_LIST ${CORE_SRC_LIST}) add_library(native-lib SHARED ${SRC_LIST})
Q3: 怎么調(diào)試CMakeLists.txt 中的代碼谱姓?
A:使用 message 方法
cmake_minimum_required(VERSION 3.4.1)
message(STATUS "execute CMakeLists")
然后運行后在
cmake/debug/{abi}/build_output.txt 中查
看 log。
Q4:什么時候 CMakeLists.txt 里面會執(zhí)行脊岳?
A:測試了下,在 sync 的時候會執(zhí)行垛玻。執(zhí)行一次后會生成 makefile 的文 件緩存之類的東西放在 externalNativeBuild 中割捅。所以如果 CMakeLists.txt 中沒有修改的話再次同步好像是不會重新執(zhí)行的。(或者刪除
.externalNativeBuild 目錄)
真正編譯的時候好像只是讀取.externalNativeBuild 目錄中已經(jīng)解析好的
makefile 去編譯帚桩。不會再去執(zhí)行 CMakeLists.txt
gcc/clang編譯器的編譯命令
編譯命令: gcc/clang -g -O2 -o log ffmpeg_log.c -I -L -l(第一豎線是大寫的i亿驾, 第三個豎線是小寫的L) 示例clang -g -O2 -o log ffmpeg_log.c -I .../ffmpeg -L .../ffmpeg/libavutil -lavutil
解析: -g 輸出文件中的調(diào)試信息 -O2 對輸出文件做指令優(yōu)化(默認是-O1是不 對指令進行優(yōu)化,-O2編譯器會按照自己的理解優(yōu)化指令账嚎,讓指令運行的更快) -o 輸出文件的名字 -o后面跟的.c文件就是要編譯的文件的名字 -I 指定頭文件的 位置 -L 指定庫文件的位置 -l 指定引用的庫文件名字 示例命令是使用ffmpeg的日 志系統(tǒng)莫瞬。
externalNativeBuild 不同環(huán)境略不同,看自己配置位置
#include <stdio.h>
#include <libavutil/log.h>
int main(int argc,char* argv[]){
av_log_set_level(AV_LOG_DEBUG);
av_log(NULL,AV_LOG_DEBUG,"Hello World\n");
av_log(NULL,AV_LOG_INFO,"Hello World\n");
av_log(NULL,AV_LOG_WARNING,"Hello World\n");
av_log(NULL,AV_LOG_ERROR,"Hello World\n");
return 0;
}
- 添加頭文件目錄 include_directories 命令: include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) 使用: include_directories(${CMAKE_CURRENT_LIST_DIR}/calculate) 作 用: 把當(dāng)前目錄(CMakeLists.txt所在目錄)下的calculate文件夾加入 到包含路徑
- 找到我的庫文件 link_directories 命令: link_directories(directory1 directory2 ...) 使用: link_directories(${CMAKE_CURRENT_LIST_DIR}/calculate) 作用: 與include_directories()類似郭蕉,這個命令添加了庫包含路徑。
- 添加源文件目錄 aux_source_directory 命令: aux_source_directory(
) 使用: aux_source_directory(./calculate calculateLib) 作用: 發(fā)現(xiàn)一個目錄下所有的源代碼文件并將列表存儲在一個變量 中旁振,這個指令臨時被用來 自動構(gòu)建源文件列表拐袜。因為目前 cmake 還不能自動發(fā)現(xiàn)新添加的源文件;此例子蹬铺,即是 查找 calculate路徑下的所有源文件甜攀,保存到calculateLib變量中.
注意:不會遞歸包含子目錄赴邻,僅包含指定的dir目錄 - 添加源文件目錄 add_executable 命令: add_executable( [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...]) 使 用: add_executable(calculate 作 用 : 使 用 {calculateLib} 里面的源文件來生成一個可執(zhí)行文件姥敛,起名叫calculate
注意:使用進 行 變 量 的 用 彤敛。 在 等 語 句 中 墨榄, 是 使 用 變 量 名 而 不 通 過 {}取值 - 添加源文件目錄 add_library 命令: add_library( [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2[...]) 使用: add_library(jason-lib SHARED src/main/cpp/Jason-lib.cpp) 作用: 該 指令的主要作用就是將指定的源文件生成鏈接文件,然后添加到工程 中去
關(guān)于NDK 架構(gòu)和成續(xù)參考官方demo: https://github.com/android/ndk-samples