Gradle3.0 以上創(chuàng)建 .so 文件并調(diào)用

之前沒有使用過 JNI 或 NDK 開發(fā),最近了解到把項目中的秘鑰放到 .so 文件中能起到較好的安全性作用傲绣,因此花了個早上入坑

首先配置 CMake 環(huán)境

image

在 module 工程文件的 build.gradle 文件中做以下配置

defaultConfig 的配置

    externalNativeBuild {
        cmake {
            cppFlags ""
            //生成多個版本的so文件
            abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
        }
    }

android 的配置

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"  // C 文件編輯的信息
        }
    }

關(guān)于 CMakeLists.txt 文件掠哥,跟 build.gradle 同層級

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.
#CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)

# 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.

add_library( # Sets the name of the library.
      # 設(shè)置so文件名稱.
       nativejni

       # Sets the library as a shared library.
       SHARED
       # 設(shè)置這個so文件為共享.

       # Provides a relative path to your source file(s).
       # 設(shè)置這個so文件為共享.指向創(chuàng)建的 c 文件
       src/main/jni/nativejni.c)

# 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.

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.

target_link_libraries( # Specifies the target library.
            # 制定目標(biāo)庫.
            nativejni

            # Links the target library to the log library
            # included in the NDK.
            ${log-lib} )

把上面的代碼復(fù)制到 CMakeLists.txt 文件中即可,上面的 nativejni.c 文件后面提到,先執(zhí)行上訴步驟會報錯秃诵,CMakeLists.txt 文件中的代碼執(zhí)行錯誤龙致,暫時別管,因為需要結(jié)合下面步驟一起顷链,等 .so 文件創(chuàng)建完就沒事了

編寫 .so 文件

  1. 首先創(chuàng)建一個 NativeUtils 文件
public class NativeUtils {
    static {
        //這是加載 .so 文件的方法,這里的 nativejni 就是 so 文件名
        System.loadLibrary("nativejni");
    }

    public static native String getStringFromNative();
}
  1. 然后 ReBuild 下項目


    image
  2. 生成頭文件
    Terminal 中調(diào)用 javah -d jni -classpath 上一步生成的 build 的 NativeUtils 路徑

javah -d jni -classpath /Users/mac/Documents/workspace/JNIDemo/app/build/intermediates/classes/debug com.feng.jnidemo.NativeUtils

jni 包中就會生成 com_feng_jnidemo_NativeUtils.h 頭文件

image

  1. 在 jni 包中創(chuàng)建 nativejni.c c 文件
//引用頭文件
#include "com_feng_jnidemo_NativeUtils.h"

//方法名:Java+頭文件名+方法名
JNIEXPORT jstring JNICALL Java_com_feng_jnidemo_NativeUtils_getStringFromNative
            (JNIEnv *env, jobject obj) {
        return (*env)->NewStringUTF(env, "this is secret key");
}

最后 Rebuild 一下發(fā)現(xiàn)生成 .so 文件


image

調(diào)用方法

String str=NativeUtils.getStringFromNative();
Log.e(TAG, "onCreate: str="+str );
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嗤练,隨后出現(xiàn)的幾起案子榛了,更是在濱河造成了極大的恐慌,老刑警劉巖煞抬,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霜大,死亡現(xiàn)場離奇詭異,居然都是意外死亡革答,警方通過查閱死者的電腦和手機(jī)战坤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來残拐,“玉大人途茫,你說我怎么就攤上這事∠常” “怎么了囊卜?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長错沃。 經(jīng)常有香客問我栅组,道長,這世上最難降的妖魔是什么枢析? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任玉掸,我火速辦了婚禮,結(jié)果婚禮上醒叁,老公的妹妹穿的比我還像新娘司浪。我一直安慰自己,他們只是感情好辐益,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布断傲。 她就那樣靜靜地躺著,像睡著了一般智政。 火紅的嫁衣襯著肌膚如雪认罩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天续捂,我揣著相機(jī)與錄音垦垂,去河邊找鬼。 笑死牙瓢,一個胖子當(dāng)著我的面吹牛劫拗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矾克,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼页慷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起酒繁,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤滓彰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后州袒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揭绑,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年郎哭,在試婚紗的時候發(fā)現(xiàn)自己被綠了他匪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡夸研,死狀恐怖邦蜜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陈惰,我是刑警寧澤畦徘,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站抬闯,受9級特大地震影響井辆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溶握,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一杯缺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睡榆,春花似錦萍肆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宿崭,卻和暖如春亲铡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葡兑。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工奖蔓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讹堤。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓吆鹤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洲守。 傳聞我的和親對象是個殘疾皇子疑务,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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