Android-通過(guò)JNI和NDK生成so庫(kù)

正在工作時(shí),突然被同事問(wèn)到:“秘鑰放在哪里比較安全活翩,X總說(shuō)我這樣寫不行烹骨。”

其實(shí)很多時(shí)候材泄,app都需要用到一些敏感的數(shù)據(jù)沮焕,例如加密的秘鑰、一些渠道的APP_ID等拉宗,但如果被別人反編譯拿到這些數(shù)據(jù)峦树,就很有可能會(huì)造成損失辣辫。
那怎么增加被獲取的難度?就是將這些數(shù)據(jù)放到C/C++的文件內(nèi)魁巩,然后將其生成為so庫(kù)急灭,交給app應(yīng)用層去調(diào)用。因?yàn)镃/C++反匯編的難度谷遂,怎么都比反編譯一個(gè)apk要難葬馋,這樣就能更加有效地保證敏感數(shù)據(jù)的安全了。

一肾扰、工具準(zhǔn)備

下載AndroidStudio畴嘶,并確保下載好了NDK和CMake。
image.png
二集晚、新建一個(gè)項(xiàng)目

普通項(xiàng)目也行窗悯,C++項(xiàng)目也行,由于C++項(xiàng)目會(huì)自動(dòng)配置CMakeList文件甩恼,所以我這里直接創(chuàng)建C++項(xiàng)目了蟀瞧。
image.png
三、編寫JNI工具類

創(chuàng)建一個(gè)Java類条摸,并在內(nèi)部定義你需要的方法悦污。


image.png
public class MyJavaJNI {
     static {
         System.loadLibrary("JniTest");
     }

     public native String getKeyStr();
}
四、將工具類編譯為class文件

首先钉蒲,在Android Studio中打開(kāi)terminal切端,在這里打開(kāi)的,其實(shí)就是終端顷啼,并不需要管環(huán)境配置踏枣,因?yàn)锳ndroid Studio其實(shí)已經(jīng)都關(guān)聯(lián)好了。
image.png

然后钙蒙,跳轉(zhuǎn)到工具類所在的目錄茵瀑,并編譯文件,之后再返回到j(luò)ava目錄躬厌。

cd com/cjy/solibrarydemo

javac MyJavaJNI.java

cd..
cd..
cd..

最后马昨,通過(guò)命令javah -jni com.cjy.solibrarydemo.MyJavaJNI生成C文件。完成后扛施,你會(huì)看到跟下圖差不多的文件結(jié)構(gòu)鸿捧。
image.png
五、創(chuàng)建JNI文件夾疙渣,并且把第四步中的C文件放進(jìn)去匙奴。

右鍵app項(xiàng)目,new出JNI文件夾妄荔。
image.png

將C文件放進(jìn)去泼菌,并將后綴名改為.c谍肤。
image.png
六、修改CMakeList文件并編寫方法灶轰。

CMakeLists.txt

cmake_minimum_required(VERSION 3.18.1)
set(srcDir ${CMAKE_SOURCE_DIR}/../..)
project("solibrarydemo")

add_library(
        javaJni

        SHARED

        ${srcDir}/main/jni/com_cjy_solibrarydemo_MyJavaJNI.c
)

add_library( # Sets the name of the library.
        solibrarydemo

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        native-lib.cpp)

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)

target_link_libraries( # Specifies the target library.
        solibrarydemo
        javaJni
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

com_cjy_solibrarydemo_MyJavaJNI.c

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_cjy_solibrarydemo_MyJavaJNI */

#ifndef _Included_com_cjy_solibrarydemo_MyJavaJNI
#define _Included_com_cjy_solibrarydemo_MyJavaJNI

#define keyStr "123456789"

#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_cjy_solibrarydemo_MyJavaJNI
 * Method:    getKeyStr
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring

JNICALL Java_com_cjy_solibrarydemo_MyJavaJNI_getKeyStr
  (JNIEnv *env, jclass objt){
    return (*env)->NewStringUTF(env,keyStr);
};

#ifdef __cplusplus
}
#endif
#endif
七谣沸、生成so庫(kù)

先配置你需要生成的CPU架構(gòu),在build.gradle中增加配置項(xiàng)笋颤。

externalNativeBuild {
            cmake {
                cppFlags ''
                abiFilters "arm64-v8a", "armeabi-v7a"
            }
        }

開(kāi)始生成so庫(kù)。


image.png

查看結(jié)果:
image.png
這里的libjavaJni.so内地,就是我們需要的so庫(kù)了伴澄。
八、使用so庫(kù)

一般的情況下阱缓,都是自己的項(xiàng)目非凌,那使用的做法就很簡(jiǎn)單,將所有架構(gòu)的so文件荆针,復(fù)制到libs文件夾中敞嗡,然后在你需要調(diào)用方法的地方直接調(diào)用就行了。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Example of a call to a native method
        binding.sampleText.text = MyJavaJNI.getKeyStr()
    }

但是如果是需要提供給別人用的航背,那就不能這樣了喉悴。因?yàn)閯e人復(fù)制了你的so文件之余,還需要新建工具類的全路徑玖媚,一模一樣的那種箕肃,再?gòu)?fù)制工具類(MyJavaJNI.java)進(jìn)去,才能正常使用今魔。
這時(shí)候我們應(yīng)該將工具類打包成aar或者jar文件勺像,一起提供給別人使用,這樣別人就不用那么麻煩了错森。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吟宦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涩维,更是在濱河造成了極大的恐慌殃姓,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件激挪,死亡現(xiàn)場(chǎng)離奇詭異辰狡,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)垄分,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門宛篇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人薄湿,你說(shuō)我怎么就攤上這事叫倍⊥滴裕” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵吆倦,是天一觀的道長(zhǎng)听诸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蚕泽,這世上最難降的妖魔是什么晌梨? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮须妻,結(jié)果婚禮上仔蝌,老公的妹妹穿的比我還像新娘。我一直安慰自己荒吏,他們只是感情好敛惊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著绰更,像睡著了一般瞧挤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儡湾,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天特恬,我揣著相機(jī)與錄音,去河邊找鬼盒粮。 笑死鸵鸥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丹皱。 我是一名探鬼主播妒穴,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摊崭!你這毒婦竟也來(lái)了讼油?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呢簸,失蹤者是張志新(化名)和其女友劉穎矮台,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體根时,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘦赫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛤迎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片确虱。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖替裆,靈堂內(nèi)的尸體忽然破棺而出校辩,到底是詐尸還是另有隱情窘问,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布宜咒,位于F島的核電站惠赫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏故黑。R本人自食惡果不足惜儿咱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望场晶。 院中可真熱鬧概疆,春花似錦、人聲如沸峰搪。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)概耻。三九已至,卻和暖如春罐呼,著一層夾襖步出監(jiān)牢的瞬間鞠柄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工嫉柴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厌杜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓计螺,卻偏偏與公主長(zhǎng)得像夯尽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子登馒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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