搞了很久的Android開發(fā)了淑廊,一直在使用別人(第三方的sdk),所以今天突發(fā)奇想特咆,自己搞一個(gè)NDK項(xiàng)目提供給其他app使用季惩。本篇文章就從ndk環(huán)境到SDK生成、使用一起說說腻格。廢話 不多少開始動(dòng)起來吧;啊!
一菜职、Android studio ndk環(huán)境
? ? ? ? 點(diǎn)擊SDK? Manager,如下圖所示安裝ndk青抛。
二、創(chuàng)建NDK項(xiàng)目
? ? File->new? -> new project 選擇native c++ 些楣、
如上圖所示脂凶。next->next->finish 即可生成NDK示例項(xiàng)目宪睹。
三愁茁、生成jar及so庫
完成上述兩步之后,會看到如下的項(xiàng)目結(jié)構(gòu):
MainActivity通過System.loadLibrary("nattive-lib")方法加載cpp下的natice-lib.cpp文件亭病。打開natice-lib.cpp文件我們可以看到?Java_com_yan_ndkdemo_MainActivity_stringFromJNI鹅很,它的命名格式就是JAVA_包名_(調(diào)用的類名)_方法名。所以我們在其他的項(xiàng)目是不可以直接調(diào)用我們的cpp罪帖,so庫就是cpp寫的程序打包成的促煮,也就是說我們?nèi)绻苯舆@樣打包成so庫,那么別人在使用的時(shí)候必須建立一個(gè)和我們包名整袁、類名菠齿、方法名一樣的類才可以調(diào)用,為了讓調(diào)用者開發(fā)便捷所以我們就得為我們的so庫編寫調(diào)用的sdk供別人使用坐昙。
1绳匀、新建我們的sdk程序類去實(shí)現(xiàn)和MainActivity一樣的加載so庫的方法 和調(diào)用cpp的方法,如下圖 我新建了個(gè)module
TestJni里面stringFromJNI方法報(bào)錯(cuò)是因?yàn)槲覀僣pp里面調(diào)用的是MainActivity下stringFromJNI炸客,換就話說就是沒有cpp去實(shí)現(xiàn)TestJni下的stringFromJNI方法疾棵。 ndklib的包名須和主工程包名一致。
2痹仙、更改主工程中nattive-lib.cpp下的代碼
將類名改成TestJni
3是尔、生成so庫
在主項(xiàng)目build.gradle加入如下代碼
cmake {
cppFlags""
? ? abiFilters'arm64-v8a','armeabi-v7a','x86','x86_64'
}
build-》Rebuild project? 生成so庫在下圖所示位置
4.生成jar
在ndklib下build.gradle加入如下代碼
task againMakeJar(type: Copy) {
? ? def name = 'NdkLib' //Library名稱
? ? delete 'libs/' + name + '.jar' //刪除之前的舊jar包
? ? from('build/intermediates/packaged-classes/release/') //從這個(gè)目錄下取出默認(rèn)jar包
? ? into('libs/') //將jar包輸出到指定目錄下
? ? include('classes.jar')
? ? rename('classes.jar', name + '.jar') //自定義jar包的名字
}
againMakeJar.dependsOn(build)
點(diǎn)擊右側(cè)Gradle找到ndklib下的other-》againMakeJar,生成jar
生成的jar文件就在ndklib下的libs文件夾下
最后把3开仰、4生成的so庫和jar 導(dǎo)入到其他項(xiàng)目就可以使用拟枚。如下圖項(xiàng)目結(jié)構(gòu)和使用: