NDK入門(一)

文章來源:https://pioneerzdb.com/2019/02/23/NDK(%E4%B8%80)/

前言:學(xué)習(xí)一個(gè)新知識(shí)時(shí),無非就是弄懂三個(gè)問題:
1.這個(gè)是什么?
2.為什么要學(xué)習(xí)這個(gè)?
3.怎么做?

首先貼出官方介紹地址:https://developer.android.com/ndk/guides

NDK是什么?

NDK:即Native development kit(原聲開發(fā)工具)縮寫。其實(shí)從Android誕生之初,就已經(jīng)支持C/C++開發(fā),開發(fā)者可以通過jni完成自己的動(dòng)態(tài)庫(so)開發(fā),但是這樣存在一個(gè)問題:如何將so庫和我們的工程一起打包?而且這里面也存在著一些技術(shù)障礙,比如:很難調(diào)用framework層的api,兼容性難以保障等問題。所以,NDK就應(yīng)運(yùn)而生了。由此可知,他是一款開發(fā)工具集,可以幫助我們更快的開發(fā)so庫,以及和java工程一起打包等。

為什么要用NDK?

無非就是用NDK有什么好處?
1.可以快速的開發(fā)出so庫,以便共享
2.安全性高,java層的代碼很容易被反編譯,雖然做了混淆,但是懂得smali語法的人看起來還是很容易的,所以so庫還是很難被反編譯的。
3.提高執(zhí)行效率和性能,論起執(zhí)行效率,C/C++是要快于java的。

使用場(chǎng)景

由上面可以知道:
1.重復(fù)使用自己或者別人開發(fā)的c/c++庫
2.進(jìn)一步提升設(shè)備性能

怎么做?

首先貼出官方示例:https://github.com/googlesamples/android-ndk/tree/master

環(huán)境要求:

Android stadio 2.2及其更高版本

下載NDK工具包:

1.打開Android stadio的SDK Tools

SDKTools

NDK:這套工具允許您為 Android 使用 C 和 C++ 代碼。
CMake:一款外部構(gòu)建工具,可與 Gradle 搭配使用來構(gòu)建原生庫。如果您只計(jì)劃使用 ndk-build,則不需要此組件。
LLDB:一種調(diào)試程序,Android Studio 使用它來調(diào)試原生代碼。

將圖中所指的三個(gè)文件下載即可

手動(dòng)創(chuàng)建一個(gè)demo

create

因?yàn)槲疫@是Android stadio3.3的,所以界面呈現(xiàn)這樣子的,可能每個(gè)版本都不一樣,然后點(diǎn)擊Native C++,下面都是next,然后finish即可。
查看目錄時(shí)你會(huì)發(fā)現(xiàn)多了一個(gè)cpp目錄,該目錄下面有兩個(gè)文件,一個(gè)是CMarkLists.txt,一個(gè)是native-lib.cpp。
我們先來看看native-lib.cpp文件:
native-lib.cpp

我們可以看到它里面其實(shí)就是用C寫的一些源代碼。
參數(shù)說明:
1、extern “C”:實(shí)現(xiàn) C 和 C++ 的混合編程,用于 C++ 代碼調(diào)用 C 的函數(shù)
2、JNIEXPORT 和 JNICALL,用于標(biāo)識(shí)函數(shù)用途的兩個(gè)宏
3、jstring,JNI 中的數(shù)據(jù)類型,對(duì)應(yīng) Java 中 String 類型,還有 8 種基本數(shù)據(jù)類型 jbyte、jchar、jshort、jint、jlong、jfloat、jdouble、jboolean,引用數(shù)據(jù)類型 jintArray、jshortArray、jlongArray 等。
4、函數(shù)命名規(guī)則:Java類全路徑方法名,這里的類是那個(gè)調(diào)用 C 或 C++ 的類,像這里的 Java_com_timcoder_ndkproject_NativeHelper_buttonFromJNI
5、函數(shù)的參數(shù):JNIENV和jobject。這兩個(gè)參數(shù)暫時(shí)還未用到,也沒研究,等后面研究之后再來更新

我們?cè)賮砜纯碈MarkLists文件:

CMarkLists

這張圖片沒有截全,它里面有三個(gè)方法:add_library, find_library, target_link_libraries, 而且官方注釋的也很清楚,我就不再重復(fù)了。
CMakeList.txt 是腳本文件, 需要指定包含哪些源代碼

大致了解了結(jié)構(gòu),那我們就先來做個(gè)很簡(jiǎn)單的小demo:

目標(biāo)實(shí)現(xiàn):點(diǎn)擊button,改變textview的內(nèi)容。

button

我自己創(chuàng)建了一個(gè)button-lib.cpp文件,你也可以使用官方的native-lib.cpp文件,在其里面添加一個(gè)相應(yīng)的方法就行。如果要自己創(chuàng)建源文件的話,還記得剛才上面所說的CMarklists文件的作用嘛?一定要在它里面配置源代碼的路徑才會(huì)生效

完成demo已上傳至github

demo地址:https://github.com/pioneerz/NDKProject

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 生活就是如此,不會(huì)因?yàn)槟愕谋瘋徒o你一個(gè)完美的ending。 《海邊曼徹斯特》這或許是我看過最悲慘的一部電影,主角...
    喵柒閱讀 241評(píng)論 0 0
  • 又到了一年一季麥子飄香的季節(jié)了,每到這個(gè)季節(jié),心里總會(huì)緊張那么一陣兒,或許是在老家種過地的原因吧!往年收麥子的情景...
    鄉(xiāng)村的月兒閱讀 428評(píng)論 2 4
  • 水滴,好亂啊,明天再畫一遍。
    默默泡泡兔閱讀 229評(píng)論 0 1
  • 我所不知道的昆蟲世界 《昆蟲記》是一部引人入勝的書,是法國昆蟲學(xué)家法布爾花了足足三十年時(shí)間...
    少年_3754閱讀 227評(píng)論 0 0

友情鏈接更多精彩內(nèi)容