Android Studio 3.2 JNI (ndk-build)

記錄下 Android Studio 嵌入 C 代碼的過程听皿,使用 ndk-build. 當(dāng)前環(huán)境:

  • Android Studio 3.2
  • NDK 18.1

創(chuàng)建 JNI 文件夾

直接在項(xiàng)目右鍵,選擇 New - Folder - JNI Folder 捺宗,對話框直接點(diǎn)擊 Finish 即可方便地在默認(rèn)位置創(chuàng)建 jni 文件夾用于存放 c 源碼脑沿。默認(rèn)位置在 app/src/main/jni.

創(chuàng)建 Java 類

首先創(chuàng)建一個(gè) Java 類用于調(diào)用 c 代碼。

public class JniTest {

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

    public static native String getString();
}

生成頭文件 (.h)

命令行

最直接的方式就是通過命令行生成。

首先使用 javac 編譯 java 文件茴肥。

小技巧。使用右鍵按住拖動(dòng)文件夾到終端面板荡灾,可以快速進(jìn)入對應(yīng)目錄瓤狐。


進(jìn)入到文件所在目錄后執(zhí)行 javac JniTest.java 編譯。成功后會(huì)出現(xiàn) JniTest.class 文件批幌。

然后退回到包外目錄執(zhí)行 javah -jni 生成頭文件础锐。

注意路徑不要寫錯(cuò)了,最后也不需要加文件擴(kuò)展名荧缘。成功后會(huì)生成一個(gè) .h 文件皆警,把它手動(dòng)移到 jni 目錄。之前編譯出的 .class 文件可以刪掉了截粗。最終目錄結(jié)構(gòu)如下:

配置外部工具

每次都這樣搞一遍很麻煩信姓,我們可以配置一下擴(kuò)展工具鸵隧,這樣一勞永逸。

點(diǎn)擊File - Setting - Tools - External Tools 打開外部工具配置頁意推,點(diǎn)擊 + 新建一個(gè)工具豆瘫。

先起個(gè)名字叫,這里叫做 javah.

  • Program: $JDKPath$\bin\javah.exe
  • Arguments: -classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$
  • Working directory: $ModuleFileDir$\src\main\Java

點(diǎn)擊 OK 保存后就新建了一個(gè)工具左痢。此時(shí)我們右擊 JniTest.java靡羡,在菜單中選擇 External Tools - javah 就可以快速生成頭文件并放到 jni 目錄。

編寫 c 代碼

在 jni 目錄新建 一個(gè) c 語言源碼俊性,這里叫做 JinLib.cpp. 然后實(shí)現(xiàn)頭文件中所定義的函數(shù)略步,別忘引入頭文件。這里簡單地返回一個(gè)字符串:

// 頭文件 可能不同
#include  <cc_chenhe_ndkdemo_JniTest.h>
/*
 * Class:     cc_chenhe_ndkdemo_JniTest
 * Method:    getString * Signature: ()Ljava/lang/String;
 */
 JNIEXPORT jstring JNICALL Java_cc_chenhe_ndkdemo_JniTest_getString
  (JNIEnv * env, jclass){
    return (*env).NewStringUTF("Hello cpp");
  }

創(chuàng)建 mk 文件

mk 文件用于告訴 ndk-build 該如何編譯 c 源碼定页,詳情見官方指南趟薄。

在 jni 目錄下創(chuàng)建 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := JniLib
LOCAL_SRC_FILES =: JniLib.cpp
include $(BUILD_SHARED_LIBRARY)

其中 LOCAL_SRC_FILES 列出了所有要編譯的 c 源碼文件。

然后創(chuàng)建 Application.mk

APP_MODULES := JniLib
APP_ABI := all

gradle 配置

在 module 的 build.gradle 里典徊,amndroid.defaultConfig 下加入下面配置:

ndk{
    moduleName "JniLib" 
    //abiFilters \"armeabi-v7a", "x86" //輸出指定abi下的so庫
}
sourceSets.main{
    jni.srcDirs = []
    jniLibs.srcDir "src/main/libs"
}

編譯

編譯需要使用 ndk-build杭煎,其位于 ndk 目錄下。如果要直接在命令行使用需要添加環(huán)境變量卒落。類似的羡铲,為了方便我也添加了一個(gè)外部工具。

  • Program: C:\Users\Chenhe\AppData\Local\Android\Sdk\ndk-bundle\build\ndk-build.cmd
  • Working directory: $ProjectFileDir$\app\src\main

注意改成你自己的目錄儡毕。

任意找個(gè)第地方右擊也切,選擇 External Tools - ndk-build 即可編譯 c 源碼。成功后可以看見創(chuàng)建了 libs 目錄腰湾,里面包含了不同平臺(tái)下的 so 文件雷恃。

運(yùn)行

最后修改下 Activity 的代碼:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = findViewById(R.id.text_view);
        tv.setText(JniTest.getString());
    }
}

運(yùn)行后就可以看到效果了:

參考:https://blog.csdn.net/ziyoutiankoong/article/details/79696279

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市费坊,隨后出現(xiàn)的幾起案子倒槐,更是在濱河造成了極大的恐慌,老刑警劉巖附井,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讨越,死亡現(xiàn)場離奇詭異,居然都是意外死亡永毅,警方通過查閱死者的電腦和手機(jī)谎痢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卷雕,“玉大人,你說我怎么就攤上這事票从÷瘢” “怎么了滨嘱?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浸间。 經(jīng)常有香客問我太雨,道長,這世上最難降的妖魔是什么魁蒜? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任囊扳,我火速辦了婚禮,結(jié)果婚禮上兜看,老公的妹妹穿的比我還像新娘锥咸。我一直安慰自己,他們只是感情好细移,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布搏予。 她就那樣靜靜地躺著,像睡著了一般弧轧。 火紅的嫁衣襯著肌膚如雪雪侥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天精绎,我揣著相機(jī)與錄音速缨,去河邊找鬼。 笑死代乃,一個(gè)胖子當(dāng)著我的面吹牛旬牲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播襟己,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼引谜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了擎浴?” 一聲冷哼從身側(cè)響起员咽,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贮预,沒想到半個(gè)月后贝室,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仿吞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年滑频,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唤冈。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峡迷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绘搞,我是刑警寧澤彤避,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站夯辖,受9級特大地震影響琉预,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒿褂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一圆米、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啄栓,春花似錦娄帖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桂肌,卻和暖如春数焊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崎场。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工佩耳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谭跨。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓干厚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親螃宙。 傳聞我的和親對象是個(gè)殘疾皇子蛮瞄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359