AndroidStudio jni開發(fā)入門及打包so庫和jar包

AndroidStudio jni開發(fā)入門及打包so庫和jar包

配置ndk開發(fā)環(huán)境

  1. 下載NDK,LLDB,CMake工具包


    image
  2. 配置系統(tǒng)環(huán)境變量


    image

    image

在原有項目中進行jni開發(fā)環(huán)境配置

Androidstudio2.0之后新建的項目可直接生成cpp項目,所有詳細說下在原有項目中進行jni開發(fā)環(huán)境配置:

  1. 在src/main文件夾下建一個cpp文件夾(這里存放jni代碼)
  2. 在app文件夾下建一個CMakeLists.txt文件挠进,CMake是一種跨平臺編譯工具
代碼如下:######
cmake_minimum_required(VERSION 3.4.1)

# add_library()可添加多個咳榜,有多少個cpp文件可添加多少個
add_library( 
 # 對應(yīng)cpp的文件名
 jni-array

 # Sets the library as a shared library.
 SHARED

 # 對應(yīng)cpp的文件名地址
 src/main/cpp/jni-array.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.
   jni-array

   # Links the target library to the log library
   # included in the NDK.
   ${log-lib} )
  1. 配置app下的gradle文件
代碼
android {
    compileSdkVersion 28
    buildToolsVersion "28.0.2"
    defaultConfig {
        applicationId "com.jiax.myapplication"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                //c++的版本
                cppFlags "-std=c++14"
                abiFilters 'armeabi-v7a','x86'
            }
        }
        ndk{
            moduleName "jniTest"
            abiFilters "armeabi-v7a","x86"
        }
    }
    
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    //關(guān)聯(lián)CMakeLists.txt文件
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

編寫C層代碼##

在cpp文件夾中建一個jni-array.cpp文件

代碼
#include <jni.h>
/*JNIEXPORT和JNICALL這兩個宏(被定義在jni.h)確保這個函數(shù)在本地庫外可見揪胃,并且C編譯器會進行正確的調(diào)用轉(zhuǎn)換该默。*/
extern "C"
/*
 *數(shù)組求和  */
JNIEXPORT jint JNICALL
Java_com_jiax_yugang_java_SimpleJniUtil_sumArray(JNIEnv *env, jclass type, jintArray arr_) {
    /*jint *arr = env->GetIntArrayElements(arr_, NULL);
    env->ReleaseIntArrayElements(arr_, arr, 0);*/
    jsize len = env->GetArrayLength(arr_);
    int buf[len];
    int sum = 0;
    //將基本類型數(shù)組某一區(qū)域復(fù)制到緩沖區(qū)中的一組函數(shù)把鉴。
    env->GetIntArrayRegion(arr_, 0, len, buf);
    for (int i = 0; i < len; i++) {
        sum += buf[i];
    }

    return sum;
}

打包so庫

1.在CMakeLists.txt文件中添加so庫輸出代碼:

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
image

在Build->Make Porject后臺會在項目文件夾下生成一個jniLibs文件夾蜂林,里面就是打包好的so庫


image

編寫java代碼

拿到so庫時叔磷,要建立相關(guān)的java類對外提供api,包名要跟so庫的方法名里的包名一致阵具,方法名也必須一致才能成功調(diào)用so庫中的方法

1.在Android項目下建一個module碍遍,包名必須跟之前生成so庫里方法名的包名一致


image

image

2.編寫jni代碼,類名阳液、方法名必須跟之前生成so庫里方法名的類名怕敬、方法名一致

代碼
public class SimpleJniUtil {
    //編寫native方法
    public static native int doubleData(int data);
    public static native int sumArray(int[] arr);
    public static native int[] arrayAddTen(int[] arr);
    public static native int[][] init2DArray(int size);
    public native String getText();

    static {
        System.loadLibrary("jni-array");//導(dǎo)入so庫
    }

}

3.MakeProject,生成.class文件

打包對外提供API的jar包

1.在module下的gradle文件中配置打包任務(wù)
########代碼如下#########
task makeJar(type: Copy) {
delete 'build/libs/mylibrary.jar' //刪除已經(jīng)存在的jar包
from('build/intermediates/bundles/release/')//從該目錄下加載要打包的文件
into('build/libs/')//jar包的保存目錄
include('classes.jar')//設(shè)置過濾趁舀,只打包classes文件
rename('classes.jar', 'mylibrary.jar')//重命名赖捌,mylibrary.jar 根據(jù)自己的需求設(shè)置
}
makeJar.dependsOn(build)
2.打包


image

在工具欄切換到makejar任務(wù)運行即可打包祝沸,或在gradle欄mylibrary/other中找到makejar任務(wù)雙擊打包矮烹,打包后的jar會生成在你指定的build/libs/目錄下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市罩锐,隨后出現(xiàn)的幾起案子奉狈,更是在濱河造成了極大的恐慌,老刑警劉巖涩惑,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仁期,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機跛蛋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門熬的,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赊级,你說我怎么就攤上這事押框。” “怎么了理逊?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵橡伞,是天一觀的道長。 經(jīng)常有香客問我晋被,道長兑徘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任羡洛,我火速辦了婚禮挂脑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欲侮。我一直安慰自己最域,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布锈麸。 她就那樣靜靜地躺著镀脂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忘伞。 梳的紋絲不亂的頭發(fā)上薄翅,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音氓奈,去河邊找鬼翘魄。 笑死,一個胖子當(dāng)著我的面吹牛舀奶,可吹牛的內(nèi)容都是我干的暑竟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼育勺,長吁一口氣:“原來是場噩夢啊……” “哼但荤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涧至,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤腹躁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后南蓬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺非,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡哑了,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烧颖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弱左。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炕淮,靈堂內(nèi)的尸體忽然破棺而出科贬,到底是詐尸還是另有隱情,我是刑警寧澤鳖悠,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布榜掌,位于F島的核電站,受9級特大地震影響乘综,放射性物質(zhì)發(fā)生泄漏憎账。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一卡辰、第九天 我趴在偏房一處隱蔽的房頂上張望胞皱。 院中可真熱鬧,春花似錦九妈、人聲如沸反砌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宴树。三九已至,卻和暖如春晶疼,著一層夾襖步出監(jiān)牢的瞬間酒贬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工翠霍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锭吨,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓寒匙,卻偏偏與公主長得像零如,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锄弱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

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