非技术性文档,网上写的非常杂乱,还是自己记录下,方便之后翻阅。
一、so的生成与引入
so生成-常规有两种方式:
1.简便方式:
Android studio构建Native C++ Project,现成的开发环境,配置好CMakeLists.txt就行
选择CPU架构类型:
android {
externalNativeBuild {
cmake {
cppFlags ""
abiFilters ‘armeabi’
}
}
}
buildTypes {
debug {
...
ndk {
abiFilters "armeabi"
}
}
release {
...
ndk {
abiFilters "armeabi"
}
}
}
}
生成路径:build/intermediates/cmake/
2.通用方式:
cd 到main目录
1)生成.h文件
java -d jni -classpath 点用native方法的.class文件的绝对路径
举例:
java -d jni -classpath /Users/XXX/XXX/jniDemo2/app/build/intermediates/javac/debug/classes com.stan.jnidemo2.JniUtils
注意:classes之后空格,然后/换成.的方式构成类名
2)根据.h创建.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架构类型
}
}
buildTypes {
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk’ //引入Android.mk
}
}
}
}
这里有个关键问题提一下:怎么打armeabi类型的so?
NDK17版本开始默认不支持打armeabi类型的so了,所以选择16的版本可以打出来。
配合的最低gradle 和gradle plugin版本分别选择:4.4 、3.1.0,或者更高版本。
so引入:
so放入:libs/armeabi/目录下
当前module build.gradle指定jni目录:
android {
sourceSets {
main {
jniLibs.srcDir(['libs'])
}
}
}
如果是module的so文件,主app gradle需要配置:
defaultConfig {
...
ndk {
abiFilter "armeabi"
}
}
二、.jar的生成与引入
jar生成-常规有两种方式:
1.jar命令生成:
jar cfm XXX.jar MANIFEST.MF .class文件目录路径
或者
jar -cvf XXX.jar .class文件目录路径
.class文件目录路径就是最终XXX.jar打包出来的目录结构。所有文件就直接指定目录,单个或若干文件则单个指定。
这里目录结构不能搞错,不然找不到类。
举例:
- 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
//设置拷贝的文件
from(FILE_FROM)
//打进jar包后的文件目录
destinationDir file(OUT_PUT_DIR)
}
jar引入:
右键add as library