Android NDK JNI 開發(fā)之旅01 環(huán)境搭建入門篇

作者簡(jiǎn)介

微信公眾號(hào)(高質(zhì)量文章推送):走向全棧工程師
作者:陳博易
聲明:本文是個(gè)人原創(chuàng)蝌箍,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載
商業(yè)合作請(qǐng)?jiān)谖⑿殴娞?hào)回復(fù):聯(lián)系方式


build-->make project結(jié)果展示
項(xiàng)目運(yùn)行結(jié)果展示

前言


  1. 為什么要學(xué)習(xí)JNI呢宪肖,我的回答是:因?yàn)槲液脤W(xué)!哈哈哈
  2. 因?yàn)閏/c++比Java效率高脐区,所以應(yīng)用運(yùn)行起來速度比較快夺溢,特別是一些游戲中的算法。
  3. 為了保密抢蚀,都知道apk都可以被反編譯,就算有代碼混淆镰禾,也只是難看懂皿曲,并不是完全看不懂,但用jni編譯成.so就不同了吴侦,可以使破解的難度更加大屋休。
  4. 一個(gè)平臺(tái)(C++代碼)遷移到Android平臺(tái),底層邏輯是相同的备韧,這樣就可以通過移植劫樟,利用JNI調(diào)用底層C++代碼,避免相同邏輯的代碼重復(fù)去寫,不過這個(gè)過程一定要注意底層對(duì)象的釋放問題毅哗。

環(huán)境以及工具


  1. Android項(xiàng)目:AndroidStudio3.0
  2. NDK
  3. CMake3.6.4
  4. LLDB3.0

整體步驟


  1. AndroidStudio 3.0 NDK環(huán)境搭建
  2. NDK入門案例目錄介紹
  3. NDK入門案例代碼介紹

核心步驟解讀


1. NDK環(huán)境搭建

解釋說明一下為什么需要在sdk tools中下載 ndk cmake LLDB呢听怕?

  1. NDK:讓我們可以在 Android 上面使用 C 和 C++ 代碼的工具集。
  2. cmake:是外部構(gòu)建工具虑绵。如果你已經(jīng)知道如何使用ndk-build的話尿瞭,可以不使用它。
  3. LLDB: 可以在Android Studio上調(diào)試本地代碼
2.NDK入門案例目錄介紹
  1. cpp 文件夾存放你所有 native 代碼的地方翅睛,例如:c c++語言
  2. CMakeLists.txt 存放 CMake 或 ndk-build 構(gòu)建腳本的地方
  3. externalNativeBuild是構(gòu)建工具自動(dòng)生成的文件
3.NDK入門案例代碼介紹

MainActivity中的代碼介紹

  1. 加載類庫
  2. 聲明native方法
  3. 調(diào)用方法
public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    //在應(yīng)用開啟的時(shí)候就加載native-lib
    static {
        System.loadLibrary("native-lib");
    }
    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    //本地方法在java類中的聲明声搁,具體實(shí)現(xiàn)在'native-lib' native library
    public native String stringFromJNI();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        //調(diào)用jni中的方法
        tv.setText(stringFromJNI());
    }
}

native-lib.cpp中代碼介紹:

image.png

app/CMakeLists.txt構(gòu)建腳本翻譯:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
#CmakeLists.txt翻譯:對(duì)于更多Android Studio使用CMake的文檔信息,請(qǐng)
#閱讀documentation: https://d.android.com/studio/projects/add-native-code.html

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

#指定CMake編譯器的最低版本3.4.1
cmake_minimum_required(VERSION 3.4.1)

#設(shè)置生成的so動(dòng)態(tài)庫最后輸出的路徑
#它將會(huì)把生成的so庫按照你在 build.gradle 指定的 abi分別放置在 jniLibs下 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

# 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.
#CmakeLists.txt翻譯:創(chuàng)建一個(gè)類庫的name,設(shè)置這個(gè)類庫為STATIC
#或者SHARED類型捕发,并且設(shè)置c或者c++的源代碼的的相對(duì)路徑疏旨。
#你可以定義多個(gè)類庫,同事CMake會(huì)為你構(gòu)建扎酷。
#Gradle可以自動(dòng)將shared類庫打包到你的APK中檐涝。

# CMake根據(jù)指定的源文件生成庫文件
add_library(
            # Sets the name of the library
            #設(shè)置類庫的名字
             native-lib

             # Sets the library as a shared library.
             #生成的庫的類型[SHARED|STATIC|MODULE]
             #SHARED庫會(huì)被動(dòng)態(tài)鏈接,在運(yùn)行時(shí)被加載
             #STATIC庫是在鏈接其它目標(biāo)的時(shí)候使用
             SHARED

             # Provides a relative path to your source file(s).
             #指定路徑下的源文件代碼法挨,可以為這個(gè)類庫指定多個(gè).cpp文件
             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.
#CmakeLists.txt翻譯:搜索指定構(gòu)建庫并將變量作為存儲(chǔ)路徑谁榜。
#因?yàn)镃make構(gòu)建工具默認(rèn)包含了系統(tǒng)類庫,你僅僅需要指定你想要添加的公共NDK類庫的name.
#CMake構(gòu)建工具會(huì)在完成構(gòu)建之前校驗(yàn)指定的類庫name是否存在

# 將NDK log類庫的位置存儲(chǔ)到變量 log-lib中
#可以在構(gòu)建腳本的其他地方使用這個(gè)變量 ${log-lib}
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.
#CmakeLists.txt翻譯:指定類庫 CMake構(gòu)建工具會(huì)連接到你的目標(biāo)類庫中凡纳。
#你可以連接到多個(gè)類庫中窃植,例如:在這個(gè)CmakeLists.txt的構(gòu)建腳本中定義的類庫,
#預(yù)構(gòu)建的第三方類庫或者系統(tǒng)類庫荐糜。

#為生成的目標(biāo)類庫指定需要的庫文件
target_link_libraries(
                       # Specifies the target library.
                       #生成的目標(biāo)庫文件
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       #需要在目標(biāo)庫文件中使用的庫巷怜,表示可以在native-lib中使用log-lib庫的內(nèi)容
                       ${log-lib} )

app/build.gradle構(gòu)建文件代碼介紹

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.administrator.ndk"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //Gradle 文件配置對(duì)CMake的配置
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
        //Gradle 構(gòu)建并打包某個(gè)特定abi體系架構(gòu)下的.so庫
        ndk {
            // Specifies the ABI configurations of your native
            // libraries Gradle should build and package with your APK.
            abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
                    'arm64-v8a'
        }
    }
    buildTypes {
        release {
        }
    }
    //Gradle 文件配置對(duì)CMake的配置
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

總結(jié)


  1. 請(qǐng)大家多關(guān)注關(guān)注我。
  2. 聲明的public native String stringFromJNI()方法和Java_com_example_administrator_ndk_MainActivity_stringFromJNI中的stringFromJNI要一致暴氏。

個(gè)人相關(guān)教程

各種大佬推薦的編程視頻資源分享
Android 微信 支付寶支付延塑,2行代碼實(shí)現(xiàn)支付
Android前端 Java后端 集成支付寶支付
postman使用 Android java后端 接口調(diào)試工具
Android抓包 Charles http接口調(diào)試
消息推送 Android java后端集成小米推送
如何導(dǎo)入簡(jiǎn)單的java項(xiàng)目-IntelliJ IDEA

請(qǐng)關(guān)注我(高質(zhì)量文章推送)

源碼地址———關(guān)注微信公眾號(hào),回復(fù):ndk環(huán)境搭建

Android NDK JNI 開發(fā)之旅 開源項(xiàng)目

長(zhǎng)按二維碼“識(shí)別”關(guān)注或者掃一掃
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末答渔,一起剝皮案震驚了整個(gè)濱河市页畦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌研儒,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件独令,死亡現(xiàn)場(chǎng)離奇詭異端朵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)燃箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門冲呢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人招狸,你說我怎么就攤上這事敬拓×谑恚” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵乘凸,是天一觀的道長(zhǎng)厕诡。 經(jīng)常有香客問我,道長(zhǎng)营勤,這世上最難降的妖魔是什么灵嫌? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮葛作,結(jié)果婚禮上寿羞,老公的妹妹穿的比我還像新娘。我一直安慰自己赂蠢,他們只是感情好绪穆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虱岂,像睡著了一般玖院。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上量瓜,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天司恳,我揣著相機(jī)與錄音,去河邊找鬼绍傲。 笑死扔傅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烫饼。 我是一名探鬼主播猎塞,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼杠纵!你這毒婦竟也來了荠耽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤比藻,失蹤者是張志新(化名)和其女友劉穎铝量,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體银亲,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慢叨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了务蝠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拍谐。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轩拨,到底是詐尸還是另有隱情践瓷,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布亡蓉,位于F島的核電站晕翠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寸宵。R本人自食惡果不足惜崖面,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梯影。 院中可真熱鬧巫员,春花似錦、人聲如沸甲棍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽感猛。三九已至七扰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陪白,已是汗流浹背颈走。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咱士,地道東北人立由。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像序厉,于是被迫代替她去往敵國和親锐膜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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