非技術(shù)性文檔晰骑,網(wǎng)上寫的非常雜亂,還是自己記錄下绊序,方便之后翻閱硕舆。
一秽荞、so的生成與引入
so生成-常規(guī)有兩種方式:
1.簡便方式:
Android studio構(gòu)建Native C++ Project,現(xiàn)成的開發(fā)環(huán)境抚官,配置好CMakeLists.txt就行
選擇CPU架構(gòu)類型:
android {
externalNativeBuild {
cmake {
cppFlags ""
abiFilters ‘a(chǎn)rmeabi’
}
}
}
buildTypes {
debug {
...
ndk {
abiFilters "armeabi"
}
}
release {
...
ndk {
abiFilters "armeabi"
}
}
}
}
生成路徑:build/intermediates/cmake/
2.通用方式:
cd 到main目錄
1)生成.h文件
java -d jni -classpath 點(diǎn)用native方法的.class文件的絕對路徑
舉例:
java -d jni -classpath /Users/XXX/XXX/jniDemo2/app/build/intermediates/javac/debug/classes com.stan.jnidemo2.JniUtils
注意:classes之后空格扬跋,然后/換成.的方式構(gòu)成類名
2)根據(jù).h創(chuàng)建.cpp,編寫native代碼
3)編寫Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := so庫名
LOCAL_SRC_FILES := .cpp文件名
include $(BUILD_SHARED_LIBRARY)
jni目錄搞定:
4)配gradle
android {
defaultConfig {
ndk {
moduleName “so庫名”
abiFilters "armeabi" //支持CPU架構(gòu)類型
}
}
buildTypes {
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk’ //引入Android.mk
}
}
}
}
這里有個關(guān)鍵問題提一下:怎么打armeabi類型的so凌节?
NDK17版本開始默認(rèn)不支持打armeabi類型的so了钦听,所以選擇16的版本可以打出來。
配合的最低gradle 和gradle plugin版本分別選擇:4.4 倍奢、3.1.0朴上,或者更高版本。
so引入:
so放入:libs/armeabi/目錄下
當(dāng)前module build.gradle指定jni目錄:
android {
sourceSets {
main {
jniLibs.srcDir(['libs'])
}
}
}
如果是module的so文件娱挨,主app gradle需要配置:
defaultConfig {
...
ndk {
abiFilter "armeabi"
}
}
二余指、.jar的生成與引入
jar生成-常規(guī)有兩種方式:
1.jar命令生成:
jar cfm XXX.jar MANIFEST.MF .class文件目錄路徑
或者
jar -cvf XXX.jar .class文件目錄路徑
.class文件目錄路徑就是最終XXX.jar打包出來的目錄結(jié)構(gòu)。所有文件就直接指定目錄跷坝,單個或若干文件則單個指定酵镜。
這里目錄結(jié)構(gòu)不能搞錯,不然找不到類柴钻。
舉例:
- cd build/intermediates/classes/debug
- 將MANIFEST.MF copy到該目錄下
- 打單個文件:
jar -cfm XXX.jar MANIFEST.MF com/stan/tv/test/Jartest.class
打所有文件
jar -cfm XXX.jar MANIFEST.MF com/
2.寫個gradle task生成
def BASE_NAME = “jar包名"
def OUT_PUT_DIR = getProjectDir().getAbsolutePath() + "/libs/"
def FILE_FROM = getProjectDir().getAbsolutePath() + "/build/intermediates/classes/debug"
task makeJar(type: Jar) {
//清理目前之前的舊jar包
//delete OUT_PUT_DIR
//指定生成的jar名
baseName BASE_NAME
//設(shè)置拷貝的文件
from(FILE_FROM)
//打進(jìn)jar包后的文件目錄
destinationDir file(OUT_PUT_DIR)
}
jar引入:
右鍵add as library