AndroidStudio 3.0 NDK環(huán)境搭建

前言

網(wǎng)上關于NDK開發(fā)環(huán)境配置的相關博客已經(jīng)很多,但是很少有關于NDK在AdnroidStduio 3.0以上的環(huán)境搭建相關的博客.所以特此記錄下.
首先是對NDK的介紹,先對NDK有個初步的印象:
NDK(Native Development kit)是一個工作集,為了能讓開發(fā)者可以更加直接的接觸Android硬件資源和方便地使用傳統(tǒng)的C/C++語言編寫代碼,NDK應運而生。在NDK公布以前沼侣,Android平臺的第三方應用程序的編寫只能依靠基于Java的Dalvik虛擬機進行開發(fā)综膀。有了NDK后,開發(fā)者就可以更加方便的用傳統(tǒng)的C/C++語言編寫程序葛躏,并在程序封裝文件(.apk)中直接嵌入

  • NDK提供了一系列的工具澈段,幫助開發(fā)者快速開發(fā)C(或C++)的動態(tài)庫,并能自動將so和java應用一起打包成apk紫新。這些工具對開發(fā)者的幫助是巨大的均蜜。
  • NDK集成了交叉編譯器,并提供了相應的mk文件隔離CPU芒率、平臺囤耳、ABI等差異,開發(fā)人員只需要簡單修改mk文件(指出“哪些文件需要編譯”偶芍、“編譯特性要求”等)充择,就可以創(chuàng)建出so。
  • NDK可以自動地將so和Java應用一起打包匪蟀,極大地減輕了開發(fā)人員的打包工作椎麦。

下載工具

  1. NDK: NDK Downloads
  2. CMake:一個外部構建工具(AndroidStudio 3.0以上自帶)
  3. LLDB:用于調(diào)試本地代碼

這些工具都可以使用SDM Manager下載

當前博客所用的列子的環(huán)境如下

名稱 版本號
AndroidStudio 3.0
JDK jdk1.8.0_101
NDk 16.1.4479499
compileSdkVersion 26
buildToolsVersion 26.1.0
minSdkVersion 21
targetSdkVersion 26

創(chuàng)建一個NDK項目

new一個項目,并勾選include c++ support

20180208164209411

AndroidStudio 3.0上創(chuàng)建NDK項目的時候,記得勾選include c++ support,這樣會很方便.接著一路next 最后點擊finish.

20180208164502140

這樣一個NDK項目就已經(jīng)創(chuàng)建好了,目錄結構以及代碼如下

20180208164857742

可以看出來AS3.0勾選了include c++ support會比正常的項目多出來cpp文件夾跟CmakeLists.txt文件.這些將是我們在AS3.0上學習NDK環(huán)境開發(fā)的重點

這樣一個NDK的項目就完全建好了,并且可以運行,我們來看下運行的效果


20180208165533804

哈哈,是不是很方便?如果之前沒有勾選include c++ support 就會很麻煩,這個可以在以后的博客里說下舊的NDK項目怎么在3.0上運行,3.0已經(jīng)不同于2.0,現(xiàn)在先享受下AS給我們帶來的方便吧~

我們的項目里面Jni文件肯定不止一個,如果需要新的Jni文件的話,請按下面的步驟來

NDK自定義配置過程

創(chuàng)建一個Java文件

20180208171048688

在這個類里面寫一個native方法

20180208171842166

生成頭文件(*.h)

打開Terminal,給剛剛創(chuàng)建的類創(chuàng)建頭文件.先cd到app/src/main/java目錄下

cd app/src/main/java

然后使用javah命令

javah -d ../cpp com.vv.ndk.Hello

javah 執(zhí)行java命令生成頭文件(*.h)
-d 在當前目錄下創(chuàng)建一個文件夾,文件夾名字是cpp
com.vv.ndk.Hello 包名.類名指定要生成那個java類文件的頭文件
所以這個命令的目的是在cpp的上一層目錄下創(chuàng)建一個cpp文件夾,并對com.vv.ndk.Hello 生成一個頭文件,如下圖所示:

20180208174446624

這個命令輸入完以后在app/src/main/cpp/文件夾下多了一個com_vv_ndk_Hello.h文件,并且這個文件里面有一個未實現(xiàn)的方法Java_com_vv_ndk_Hello_sayHello,這個方法就是Hello.java方法里面對應的sayHello()方法

20180208174928653

創(chuàng)建c文件并實現(xiàn)頭文件里面的方法

Java_com_vv_ndk_Hello_sayHello 這個文件是一個抽象的方法,我們需要創(chuàng)建一個*.c文件去實現(xiàn)這個方法.

  • 我們在cpp文件夾下創(chuàng)建一個C++ Source File,命名為Hello.cpp


    20180208183405701
  • 引入com_vv_ndk_Hello.h 頭文件,并實現(xiàn)頭文件里面的Java_com_vv_ndk_Hello_sayHello 方法

20180208183623312
  • 返回一個我們想要得到的值,代碼如下
#include "com_vv_ndk_Hello.h"
JNIEXPORT jstring JNICALL Java_com_vv_ndk_Hello_sayHello(JNIEnv *env, jclass jclass1){
    return env->NewStringUTF("say Hello");
}

Java文件里面加入靜態(tài)方法塊

20180208184000363

System.loadLibrary("hello") 是NDK的moduleName

配置grade

app.gradle 文件的defaultConfig里面加上 ndk 的moduleName

defaultConfig {
        ...
        ndk{
            moduleName "hello"
        }
    }

在Activity里面調(diào)用Jni

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(Hello.sayHello());
    }
}

運行以后發(fā)現(xiàn)崩潰,不要慌

20180208184821441

崩潰是因為你還沒有配置最關鍵的CmakeLists.txt文件

配置CmakeLists.txt文件

add_library( # Sets the name of the library.
             hello

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/jni/Hello.cpp
             src/main/jni/Hi.cpp
             )
target_link_libraries( hello ${log-lib} )

ok,運行

效果如下

20180208185518666

這樣調(diào)用Hello.sayHello()方法就顯示出來了.

總結

以上是創(chuàng)建NDK項目的過程,現(xiàn)在我們來總結下創(chuàng)建的整個步驟.

  1. 創(chuàng)建一個Java文件
  2. 在這個類里面寫一個native方法
  3. 生成頭文件(*.h)
  4. 創(chuàng)建c文件并實現(xiàn)頭文件里面的方法
  5. Java文件里面加入靜態(tài)方法塊
  6. 配置grade
  7. 在Activity里面調(diào)用Jni
  8. 配置CmakeLists.txt文件

博客就到這里吧,下面將會講下CMakeLists的解析,看看這個文件到底是個啥.

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市材彪,隨后出現(xiàn)的幾起案子观挎,更是在濱河造成了極大的恐慌,老刑警劉巖段化,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘁捷,死亡現(xiàn)場離奇詭異,居然都是意外死亡显熏,警方通過查閱死者的電腦和手機雄嚣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缓升,你說我怎么就攤上這事鼓鲁。” “怎么了港谊?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵骇吭,是天一觀的道長。 經(jīng)常有香客問我封锉,道長绵跷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任成福,我火速辦了婚禮碾局,結果婚禮上,老公的妹妹穿的比我還像新娘奴艾。我一直安慰自己净当,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布蕴潦。 她就那樣靜靜地躺著像啼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潭苞。 梳的紋絲不亂的頭發(fā)上忽冻,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音此疹,去河邊找鬼僧诚。 笑死,一個胖子當著我的面吹牛蝗碎,可吹牛的內(nèi)容都是我干的湖笨。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蹦骑,長吁一口氣:“原來是場噩夢啊……” “哼慈省!你這毒婦竟也來了?” 一聲冷哼從身側響起眠菇,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤边败,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捎废,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體放闺,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年缕坎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篡悟。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡谜叹,死狀恐怖匾寝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荷腊,我是刑警寧澤艳悔,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站女仰,受9級特大地震影響猜年,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疾忍,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一乔外、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧一罩,春花似錦杨幼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汉嗽,卻和暖如春欲逃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饼暑。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工稳析, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撵孤。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓迈着,卻偏偏與公主長得像,于是被迫代替她去往敵國和親邪码。 傳聞我的和親對象是個殘疾皇子裕菠,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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