已有工程使用已存在的so库
注意 :不管动态注册还是静态注册,jni里面的函数和java 类名包名都是一一对应关系,两个不同包名的工程或者两个类无法使用同一个jni库。同一个工程下面多个类都调用jni库,可以采取辅助类或者辅助jar包的方式
添加so库到项目
第一种方式 :将库放置libs下面
由于Android Studio中,则会默认匹配main下的jniLibs目录,故如果将库放在libs下面 需要在build.gradlel里面添加如下配置
android {
......
sourceSets {
main {
jniLibs.srcDirs = ['libs']
......
}
......
}
......
}
此时将so库放到libs下面,在sync以下,AS就会自动生成jniLibs文件夹,并且有了放在libs下面的so库
捕获.PNG
第二种方式:手动创建jniLibs 文件夹,将库手动放置jniLibs 下面
在指定位置新建jniLibs文件夹,注意大小写
将so库复制到jniLibs 文件夹下编译即可
捕获.PNG
如果要精简通过so库来减少安装包的大小其实还可以通过动态选择需要添加的.so库
在App下的build.gradle中配置:
ndk {
//选择要添加的对应cpu类型的.so库。
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
// 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
注意: libs 和 jniLibs是冲突的,so库只能放在一处, 如果放在libs下面,并且指定 jniLibs.srcDirs = ['libs'], 那么手动放在jniLibs下面的库将不会加载,所以两边都有时 需要合并
java代码调用so库
捕获.PNG- 调用方法前 加载so库
- 声明native方法
- 调用native方法
已有工程NDK开发
方式一 新建module方式
优点:输出aar包,多个工程可以共用jni,不用jni注册函数和调用函数包名类名一致,相当于新建了辅助aar用于jni调用
新建->module->Android Native Library
捕获.PNG
选择完后AS工程会多出一个module
捕获.PNG
build nativelib 在对应build文件夹下面会生成aar包
捕获.PNG
方式二 主项目中NDK开发
使用传统jni目录开发
-
File->new->Folder->JNI Folder
切换到project模式会看到jni文件夹,在jni文件夹下新建cpp、Android.mk
image.png
使用cmake开发
-
File->Add C++ to module
捕获.PNG
选择创建CmakeLists这个选项后AS自动生成cpp目录如下
捕获.PNG
新工程NDK开发
新建 工程 选择 native C++
捕获.PNG
选择完后 AS会自动生成CPP文件夹,里面包含 CMakeList 和 cpp 文件
捕获.PNG
AndroidStudio更新到2.2,有了CMake和传统JNI两种开发NDK的方法,新建native工程只能得到cmake方式,要想jni开发方式,只能普通项目转jni,具体参考:https://blog.csdn.net/chenhuakang/article/details/77364926
网友评论