Android Jni开发-生成so库和aar详解(二)

上篇文章讲述了JNI的初步认识,包括如何创建,解释了默认创建的文件的作用,本文讲述从0到1生成so/aar/aar的源码包。

1.创建一个solib单独用的module
2.app模块关联solib模块
3.修改module配置为library:

3.1)把id com.android.application改为id com.android.library

3.2)把solib->build.gradle的applicationId移除;

javascript 复制代码
plugins {
//    id 'com.android.application'
    // 新创建的module默认是application,要改为library
    id 'com.android.library'
    id 'org.jetbrains.kotlin.android'
}


android {
    namespace 'com.android.solib'
    compileSdk 33

    defaultConfig {
// 新创建的module默认是有applicationId,要移除。
//        applicationId "com.android.solib"
        minSdk 24
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
4.把前面的app模块中cpp目录关于jni的代码都拷贝到solib的module
5.把app->build.gradle的关于CMakeList.txt的路径配置迁移到solib->build.gradle
javascript 复制代码
android{
    ...
    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.22.1'
        }
    }
    ...
}
6.So初始化

1.为了方便使用,我把so库的初始化也移到了solib的moudule,由于是静态注册的natvie方法,所以静态方法的声明位置改变后静态方法的实现处的名字也要修改 ,最后的效果是如下:

2.从截图可以看出,现在是2个模块,一个app,可以用于自测试,另外一个是module,把so所有内容都囊括,第三方的调用应该是要达到app模块的调用类似,引入一个so库或者aar库就可以直接使用JniUtils类。

7.生成aar的方法
java 复制代码
1.定位到  Gradle->ProjectForBlog/solib/task/build/assemble  

2.双击assemble即,生成的so文件会在ProjectForBlog/solib/build/outputs/aar,solib-release.aar和
solib-debug.aar,把solib-release.aar重命名为对应版本号即可。

如果是需要so库,则需要考虑上面说的JniUtils类是否需要了,因为so库是不能一起打包进去的,需要额外提供这个JniUtils类和so库一起,否则native方法的声明存在问题,而且JniUtils类摆放的包路径调用者还不能改变,所以现在都是提供aar的居多,调用者直接引入使用即可。

8. 生成aar对应源码包

到这个步骤,还存在一个问题,第三方调用者如果想看我们native层的源码会看不到,如果有些是需要远程调试设备的,日志不全的情况下,调用者也是希望能debug找问题再反馈的,所以可以通过以下配置额外生成一个查看源码的包

java 复制代码
//为了保证引入的aar包可以查看源码,生成的包在build/libs路径
task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}
//包含文档和源码的aar
artifacts {
    archives androidSourcesJar
}
8.1 生成source.jar方法有截图两种:
8.2 导入源码包方法

(1)比如找到JniUtils的引用处,Ctrl+左键点击进去看源码,会提示:

(2) 选择Choose Sources文件导入solib-sources.jar (这个源码建议不放到项目源码路径下,否则apk打包会打包进去,比如丢到桌面,你常用的文件夹等,不会影响项目性能等)。

(3) 关闭JniUtils,重复(1),再进去就能看到源码。

9.总结:本文系统的描述了生成so,生成aar,生成aar对应源码jar的方法。

下一章节描述如何使用动态注册,因为真实开发中静态注册的方法是极少的,大部分是要传参数的。

相关推荐
程序员黑豆6 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
剪刀石头布啊6 小时前
antd中可编辑表格中巧用useWatch实现联动高性能效果,以及定制延伸学习
前端
油丶酸萝卜别吃7 小时前
前端转全栈学习路线
前端·学习
浮生望7 小时前
前端路由进阶:History API原理与手写HistoryRouter
前端
陆枫Larry7 小时前
JavaScript 中的竞态是什么,为啥会有竟态?
前端
上海安当技术9 小时前
半天接入:USBKey RESTful API + C 动态库,Web 和 C/S 两套集成路径实战
前端·后端·restful·集成·usbkey
DevUI团队10 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_4316004411 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
kyriewen11 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
IT_陈寒11 小时前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端