Android Studio NDK開發(fā)

概述

在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");
}

步驟原理

  1. 首先,在構(gòu)建時抒倚,通過build.gradle中path所指定的路徑褐着,找到 CMakeList.txt,解析其中的內(nèi)容托呕。
  2. 按照腳本中的命令含蓉,將src/main/cpp/native-lib.cpp編譯到共享的對象 庫中,并將其命名為libnative-lib.so项郊,隨后打包到APK中馅扣。
  3. 當(dāng)應(yīng)用運行時,首先會執(zhí)行MainActivity的static代碼塊的內(nèi)容着降,使用 System.loadLibrary()加載原生庫差油。
  4. 在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;
}
  1. 添加頭文件目錄 include_directories 命令: include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) 使用: include_directories(${CMAKE_CURRENT_LIST_DIR}/calculate) 作 用: 把當(dāng)前目錄(CMakeLists.txt所在目錄)下的calculate文件夾加入 到包含路徑
  2. 找到我的庫文件 link_directories 命令: link_directories(directory1 directory2 ...) 使用: link_directories(${CMAKE_CURRENT_LIST_DIR}/calculate) 作用: 與include_directories()類似郭蕉,這個命令添加了庫包含路徑。
  3. 添加源文件目錄 aux_source_directory 命令: aux_source_directory(
    ) 使用: aux_source_directory(./calculate calculateLib) 作用: 發(fā)現(xiàn)一個目錄下所有的源代碼文件并將列表存儲在一個變量 中旁振,這個指令臨時被用來 自動構(gòu)建源文件列表拐袜。因為目前 cmake 還不能自動發(fā)現(xiàn)新添加的源文件;此例子蹬铺,即是 查找 calculate路徑下的所有源文件甜攀,保存到calculateLib變量中.
    注意:不會遞歸包含子目錄赴邻,僅包含指定的dir目錄
  4. 添加源文件目錄 add_executable 命令: add_executable( [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...]) 使 用: add_executable(calculate 作 用 : 使 用 {calculateLib} 里面的源文件來生成一個可執(zhí)行文件姥敛,起名叫calculate
    注意:使用進 行 變 量 的 用 彤敛。 在 等 語 句 中 墨榄, 是 使 用 變 量 名 而 不 通 過 {}取值
  5. 添加源文件目錄 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載阵翎,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者之剧。
  • 序言:七十年代末背稼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子词疼,更是在濱河造成了極大的恐慌贰盗,老刑警劉巖阳欲,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件书释,死亡現(xiàn)場離奇詭異爆惧,居然都是意外死亡扯再,警方通過查閱死者的電腦和手機斋竞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門坝初,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钾军,你說我怎么就攤上這事鳄袍±艄В” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵樱哼,是天一觀的道長。 經(jīng)常有香客問我搅幅,道長阅束,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任围俘,我火速辦了婚禮砸讳,結(jié)果婚禮上簿寂,老公的妹妹穿的比我還像新娘纳令。我一直安慰自己克胳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笆搓,像睡著了一般性湿。 火紅的嫁衣襯著肌膚如雪纬傲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天肤频,我揣著相機與錄音叹括,去河邊找鬼。 笑死宵荒,一個胖子當(dāng)著我的面吹牛汁雷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骇扇,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼摔竿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了少孝?” 一聲冷哼從身側(cè)響起继低,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稍走,沒想到半個月后袁翁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡婿脸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年粱胜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狐树。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡焙压,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抑钟,到底是詐尸還是另有隱情涯曲,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布在塔,位于F島的核電站幻件,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛔溃。R本人自食惡果不足惜绰沥,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贺待。 院中可真熱鬧徽曲,春花似錦、人聲如沸麸塞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喘垂。三九已至甜刻,卻和暖如春绍撞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背得院。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工傻铣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祥绞。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓非洲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜕径。 傳聞我的和親對象是個殘疾皇子两踏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355