JNI初探

NDK產(chǎn)生背景

Android平臺(tái)從誕生起奸汇,就已經(jīng)支持C件舵、C++開發(fā)。眾所周知抚太,Android的SDK基于Java實(shí)現(xiàn),這意味著基于Android SDK進(jìn)行開發(fā)的第三方應(yīng)用都必須使用Java語(yǔ)言昔案。但這并不等同于“第三方應(yīng)用只能使用Java”尿贫。在Android SDK首次發(fā)布時(shí),Google就宣稱其虛擬機(jī)Dalvik支持JNI編程方式踏揣,也就是第三方應(yīng)用完全可以通過(guò)JNI調(diào)用自己的C動(dòng)態(tài)庫(kù)庆亡,即在Android平臺(tái)上,“Java+C”的編程方式是一直都可以實(shí)現(xiàn)的捞稿。

不過(guò)又谋,Google也表示,使用原生SDK編程相比Dalvik虛擬機(jī)也有一些劣勢(shì)娱局,Android SDK文檔里彰亥,找不到任何JNI方面的幫助。即使第三方應(yīng)用開發(fā)者使用JNI完成了自己的C動(dòng)態(tài)鏈接庫(kù)(so)開發(fā)衰齐,但是so如何和應(yīng)用程序一起打包成apk并發(fā)布任斋?這里面也存在技術(shù)障礙。比如程序更加復(fù)雜耻涛,兼容性難以保障废酷,無(wú)法訪問(wèn)Framework API瘟檩,Debug難度更大等。開發(fā)者需要自行斟酌使用澈蟆。

于是NDK就應(yīng)運(yùn)而生了墨辛。NDK全稱是Native Development Kit。

NDK的發(fā)布趴俘,使“Java+C”的開發(fā)方式終于轉(zhuǎn)正睹簇,成為官方支持的開發(fā)方式。NDK將是Android平臺(tái)支持C開發(fā)的開端寥闪。

為什么使用NDK

  1. 代碼的保護(hù)带膀。由于apk的java層代碼很容易被反編譯,而C/C++庫(kù)反匯難度較大橙垢。
  2. 可以方便地使用現(xiàn)存的開源庫(kù)。大部分現(xiàn)存的開源庫(kù)都是用C/C++代碼編寫的伦糯。
  3. 提高程序的執(zhí)行效率柜某。將要求高性能的應(yīng)用邏輯使用C開發(fā),從而提高應(yīng)用程序的執(zhí)行效率敛纲。
  4. 便于移植喂击。用C/C++寫得庫(kù)可以方便在其他的嵌入式平臺(tái)上再次使用。

配置環(huán)境

  1. 下載NDK淤翔,NDK下載路徑翰绊。
    Windows下的是一個(gè)自解壓文件,下載完成后雙擊運(yùn)行旁壮,文件會(huì)自解壓到當(dāng)前目錄监嗜,記住該目錄地址,配置AndroidStudio時(shí)需要使用到這個(gè)地址

  2. 打開AndroidStudio抡谐,F(xiàn)ile -> Project Structure打開對(duì)話框裁奇,在對(duì)話框中輸入NDK路徑(上面的解壓路徑)

配置NDK路徑.pic

開啟NDK之旅

1.新建JNIDemo工程,打開MainActivity.java文件麦撵,在類內(nèi)輸入下面代碼后刽肠,Build -> Make Project

public native String getStringFromNative();

2.在Terminal輸入命令

cd app\src\main
javah -d jni -classpath C:\AndroidSdk\platforms\android-23\android.jar;..\..\build\intermediates\classes\debug com.sentu.jnidemo.MainActivity

就會(huì)發(fā)現(xiàn)在main目錄下多了一個(gè)jni文件夾,里面有生成好的頭文件

3.在jni目錄下創(chuàng)建一個(gè).c文件免胃,實(shí)現(xiàn)頭文件里聲明的方法

#include "com_sentu_jnidemo_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_sentu_jnidemo_MainActivity_getStringFromNative(JNIEnv *env, jobject obj) {
    return (*env)->NewStringUTF(env, "I'm comes from to Native Function!");
}

4.在 local.properties 文件中設(shè)置ndk的路徑

ndk.dir=C\:\\AndroidSdk\\android-ndk-r10e

5.在MainActivity.java文件中添加如下代碼

public class MainActivity extends Activity {

    public native String getStringFromNative();

    static {
        System.loadLibrary("MyJni");
    }

    TextView info;

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

        info = (TextView) findViewById(R.id.info);
        info.setText(getStringFromNative());
    }
}

6.運(yùn)行音五,查看效果

這個(gè)時(shí)候可能會(huì)出現(xiàn)一個(gè)問(wèn)題

Error:(13, 0) Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

解決方案: 在gradle.properties中添加android.useDeprecatedNdk=true

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市羔沙,隨后出現(xiàn)的幾起案子躺涝,更是在濱河造成了極大的恐慌,老刑警劉巖撬碟,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诞挨,死亡現(xiàn)場(chǎng)離奇詭異莉撇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)惶傻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門棍郎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人银室,你說(shuō)我怎么就攤上這事涂佃。” “怎么了蜈敢?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵辜荠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抓狭,道長(zhǎng)伯病,這世上最難降的妖魔是什么发侵? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任训桶,我火速辦了婚禮,結(jié)果婚禮上苦锨,老公的妹妹穿的比我還像新娘苗桂。我一直安慰自己药磺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布煤伟。 她就那樣靜靜地躺著癌佩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪便锨。 梳的紋絲不亂的頭發(fā)上围辙,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音放案,去河邊找鬼酌畜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卿叽,可吹牛的內(nèi)容都是我干的桥胞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼考婴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贩虾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起沥阱,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缎罢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體策精,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舰始,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咽袜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丸卷。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖询刹,靈堂內(nèi)的尸體忽然破棺而出谜嫉,到底是詐尸還是另有隱情,我是刑警寧澤凹联,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布沐兰,位于F島的核電站,受9級(jí)特大地震影響蔽挠,放射性物質(zhì)發(fā)生泄漏住闯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一澳淑、第九天 我趴在偏房一處隱蔽的房頂上張望寞秃。 院中可真熱鬧,春花似錦偶惠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谢床,卻和暖如春兄一,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背识腿。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工出革, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渡讼。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓骂束,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親成箫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子展箱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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