【NDK Lab】CMAKE 創(chuàng)建新的C或C++原生庫(kù)(基礎(chǔ)篇)

1、創(chuàng)建新項(xiàng)目(Create New Project)

點(diǎn)擊File — New — New Project宰掉,把Include C++ Support前面的CheckBook勾上麻汰,然后依次進(jìn)行接下來(lái)的操作

create new project

2窟扑、配置C++支持功能(Customize C++ Support)

在Customize C++ Support界面默認(rèn)即可

customize C++ Support
  • C++ Standard
    指定編譯庫(kù)的環(huán)境预皇,其中Toolchain Default使用的是默認(rèn)的CMake環(huán)境撤蚊;C++ 11也就是C++環(huán)境奕短。
  • Exceptions Support
    如果選中復(fù)選框宜肉,則表示當(dāng)前項(xiàng)目支持C++異常處理,如果支持翎碑,在項(xiàng)目Module級(jí)別的build.gradle文件中會(huì)增加一個(gè)標(biāo)識(shí) -fexceptions到cppFlags屬性中谬返,并且在so庫(kù)構(gòu)建時(shí),gradle會(huì)把該屬性值傳遞給CMake進(jìn)行構(gòu)建日杈。
  • Runtime Type Information Support
    同理遣铝,選中復(fù)選框,項(xiàng)目支持RTTI莉擒,屬性cppFlags增加標(biāo)識(shí)-frtti
JniCmake項(xiàng)目主體結(jié)構(gòu)

3酿炸、CMakeLists.txt構(gòu)建

CMakeLists.txt文件用于配置JNI項(xiàng)目屬性,主要用于聲明CMake使用版本涨冀、so庫(kù)名稱填硕、C/CPP文件路徑等信息,下面是該文件內(nèi)容:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
  • cmake_minimum_required(VERSION 3.4.1)
    CMake最小版本使用的是3.4.1鹿鳖。

  • add_library()
    配置so庫(kù)信息(為當(dāng)前腳本文件添加庫(kù))

  • native-lib這個(gè)是聲明引用so庫(kù)的名稱扁眯,在項(xiàng)目中,如果需要使用這個(gè)so文件翅帜,引用的名稱就是這個(gè)姻檀。值得注意的是,實(shí)際上生成的so文件名稱是libnative-lib涝滴。當(dāng)Run項(xiàng)目或者build項(xiàng)目是绣版,在Module級(jí)別的build文件下的intermediates\transforms\mergeJniLibs\debug\folders\2000\1f\main
    下會(huì)生成相應(yīng)的so庫(kù)文件。
  • SHARED這個(gè)參數(shù)表示共享so庫(kù)文件歼疮,也就是在Run項(xiàng)目或者build項(xiàng)目時(shí)會(huì)在目錄intermediates\transforms\mergeJniLibs\debug\folders\2000\1f\main
    下生成so庫(kù)文杂抽。此外,so庫(kù)文件都會(huì)在打包到.apk里面腋妙,可以通過(guò)選擇菜單欄的Build->Analyze Apk...*查看apk中是否存在so庫(kù)文件,一般它會(huì)存放在lib目錄下讯榕。
  • src/main/cpp/native-lib.cpp 構(gòu)建so庫(kù)的源文件骤素。
  • STATIC:靜態(tài)庫(kù)匙睹,是目標(biāo)文件的歸檔文件,在鏈接其它目標(biāo)的時(shí)候使用济竹。
  • SHARED:動(dòng)態(tài)庫(kù)痕檬,會(huì)被動(dòng)態(tài)鏈接,在運(yùn)行時(shí)被加載送浊。
  • MODULE:模塊庫(kù)梦谜,是不會(huì)被鏈接到其它目標(biāo)中的插件,但是可能會(huì)在運(yùn)行時(shí)使用dlopen-系列的函數(shù)動(dòng)態(tài)鏈接
  • include_directories
    配置頭文件路徑目錄

  • find_library()
    這個(gè)方法與我們要?jiǎng)?chuàng)建的so庫(kù)無(wú)關(guān)而是使用NDK的Apis或者庫(kù)袭景,默認(rèn)情況下Android平臺(tái)集成了很多NDK庫(kù)文件唁桩,所以這些文件是沒(méi)有必要打包到apk里面去的。直接聲明想要使用的庫(kù)名稱即可(猜測(cè):貌似是在Sytem/libs目錄下)耸棒。在這里不需要指定庫(kù)的路徑荒澡,因?yàn)檫@個(gè)路徑已經(jīng)是CMake路徑搜索的一部分。如示例中使用的是log相關(guān)的so庫(kù)与殃。

  • log-lib這個(gè)指定的是在NDK庫(kù)中每個(gè)類型的庫(kù)會(huì)存放一個(gè)特定的位置单山,而log庫(kù)存放在log-lib中
  • log指定使用log庫(kù)
  • target_link_libraries()
    如果你本地的庫(kù)(native-lib)想要調(diào)用log庫(kù)的方法,那么就需要配置這個(gè)屬性幅疼,意思是把NDK庫(kù)關(guān)聯(lián)到本地庫(kù)米奸。
  • native-lib要被關(guān)聯(lián)的庫(kù)名稱
  • ${log-lib}要關(guān)聯(lián)的庫(kù)名稱,要用大括號(hào)包裹爽篷,前面還要有$符號(hào)去引用悴晰。

實(shí)際上,我們可以自己創(chuàng)建CMakeLists.txt文件狼忱,而且路徑不受限制膨疏,只要在build.gradle中配置externalNativeBuild.cmake.path來(lái)指定該文件路徑即可

4、MainActivity調(diào)用和運(yùn)行結(jié)果

MainActivity
JniCmake運(yùn)行效果圖

其它

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钻弄,一起剝皮案震驚了整個(gè)濱河市佃却,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窘俺,老刑警劉巖饲帅,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘤泪,居然都是意外死亡灶泵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門对途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赦邻,“玉大人,你說(shuō)我怎么就攤上這事实檀』讨蓿” “怎么了按声?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)恬吕。 經(jīng)常有香客問(wèn)我签则,道長(zhǎng),這世上最難降的妖魔是什么铐料? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任渐裂,我火速辦了婚禮,結(jié)果婚禮上钠惩,老公的妹妹穿的比我還像新娘柒凉。我一直安慰自己,他們只是感情好妻柒,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布扛拨。 她就那樣靜靜地躺著,像睡著了一般举塔。 火紅的嫁衣襯著肌膚如雪绑警。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天央渣,我揣著相機(jī)與錄音计盒,去河邊找鬼。 笑死芽丹,一個(gè)胖子當(dāng)著我的面吹牛北启,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拔第,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咕村,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蚊俺?” 一聲冷哼從身側(cè)響起懈涛,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泳猬,沒(méi)想到半個(gè)月后批钠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡得封,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年埋心,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忙上。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拷呆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茬斧,我是刑警寧澤箫柳,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站啥供,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏库糠。R本人自食惡果不足惜伙狐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞬欧。 院中可真熱鬧贷屎,春花似錦、人聲如沸艘虎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)野建。三九已至属划,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間候生,已是汗流浹背同眯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唯鸭,地道東北人须蜗。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像目溉,于是被迫代替她去往敵國(guó)和親明肮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容