如何生成so并暴露给第三方使用
一般情况下我们直接生成一个支持 native 开发的项目, 在java文件中声明native方法在c,c++文件中实现native方法,通过cmake 配置c,c++文件,在java中调用声明的native方法即可
当我们生成so时 ,调用native方法时,方法路径必须与原包名相同,在这种情况下一般我们有几种方式来处理
- 通过jar
- 生成so 后生成jar包 jar中存在声明native函数的 java 类 将so和jar导入到项目中即可
- 通过aar
- 直接生成aar文件,aar中就包含so 和 声明native函数的java类
通过jar的形式
生成so
-
将cmake配置好名称 和 要编译的c,c++文件
-
cmake_minimum_required(VERSION 3.10.2) # 设置项目名字 project("checkroot") #设置输出名字以及指定生成是静态库还是动态库 动态库为shared 静态库为 static 设置要编译的native文件 add_library( # Sets the name of the library. checkroot # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). native-lib.cpp) find_library( # Sets the name of the path variable. log-lib # Specifies the name of the NDK library that # you want CMake to locate. log) target_link_libraries( # Specifies the target library. checkroot # Links the target library to the log library # included in the NDK. ${log-lib})
-
-
在
native moudle
的gradle
文件中的defaultconfig
{}下添加如下代码-
externalNativeBuild { cmake { cppFlags "" //指定生成的 cpu 类型 不写就是默认全生成 abiFilters "arm64-v8a","armeabi-v7a" } }
-
-
在As右侧的
Gradle->你的项目-> 你的native module -> Tasks->build->assemble
双击执行即可- 例 本项目就是
Gradle->NativeCheckRoot->nativelib->Tasks->build->assemble
- 生成的so 就在
build/intermediates/cmake
下
- 例 本项目就是
生成jar
-
我使用的
AndroidStudio Arctic Fox
-
在native module 的
build.gradle
中添加如下代码 – 代码级别与android,dependencies
同级别-
//该task用来打包jar包--- 生成jar包 task makeJar(type: Copy) { delete 'libs/sdk.jar' //删除已经存在的jar包 from('build/intermediates/aar_main_jar/release/')//从该目录下加载要打包的文件,注意这个目录,不同版本的AndroidStudio不一样,比如在3.0版本是build/intermediates/bundles/release/,要自己看下。 into('libs/')//jar包的保存目录 include('classes.jar')//设置过滤,只打包classes文件 rename('classes.jar', 'libroot.jar')//重命名,libroot.jar 根据需求设置 } makeJar.dependsOn(build)
-
执行build即可在
nativelib/libs
目录下生成libroot.jar
- 注意这里的
nativelib/libs
不是固定的 只是我的native module
刚好叫nativelib 在moudle
里我又新建了个目录叫libs
而已 这里可以随便配置
- 注意这里的
-
其他项目使用
-
新建一个
Android 项目
-
在
app
目录下新建libs
文件夹 -
将生成的对应
cpu
架构的so文件夹,以及jar包
复制到libs
目录下 -
在
app/build.gradle
文件中的android{}
内添加如下代码 指定jniLibs
路径 当然也可以在main内创建jniLibs 文件夹
配置也可以-
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
-
-
在
app/build.gradle
文件中的dependencies
下添加如下代码 引入jar-
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation files('libs/libroot.jar')
-
-
通过
RootUtlis
调用即可- 这里我在
java类 RootUtils
中声明了native方法,所以调用也是通过RootUtils
- 这里我在
-
执行完上述操作之后 就可以将so 配合jar 提供给三方使用了
通过aar形式
生成aar
-
在As右侧的
Gradle->你的项目-> 你的native module -> Tasks->build->assemble
双击执行即可build/outputs/aar
生成的aar 就在这个路径下- aar中就包含了so 和 生成的class.jar 所以不用再生成jar
-
将aar文件复制到上述所说的libs文件夹下
-
在
app/build.gradle
文件中的dependencies
下添加如下代码 引入aar 即可使用-
implementation files('libs/libroot.aar')
-
直接使用该module 也行
-
在 项目
settings.gradle
内 添加include ':nativelib'
- nativelib就是module的名字
-
在
app/build.gradle
文件中的dependencies
下添加如下代码 引入module即可使用-
implementation project(path: ':nativelib')
-