后端砖头

AS jni开发流程实例讲解

2022-05-31  本文已影响0人  三十五岁养老

已有工程使用已存在的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

已有工程NDK开发

方式一 新建module方式

优点:输出aar包,多个工程可以共用jni,不用jni注册函数和调用函数包名类名一致,相当于新建了辅助aar用于jni调用

新建->module->Android Native Library


捕获.PNG

选择完后AS工程会多出一个module


捕获.PNG
build nativelib 在对应build文件夹下面会生成aar包
捕获.PNG
方式二 主项目中NDK开发

使用传统jni目录开发

新工程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

上一篇下一篇

猜你喜欢

热点阅读