文章目录
目录
文章目录
基础信息
我的AS基础信息
gradle插件版本
硬件信息
基础知识
externalNativeBuild
具体操作步骤
下载NDK库
加入JNI相关C语言代码和mk文件
local.properties里配置ndk路径
gradle配置
配置externalNativeBuild
打包动态库
引用第三方so库
异常问题
最终效果展示
基础信息
我的AS基础信息
Android Studio Dolphin | 2021.3.1 Patch 1
Build #AI-213.7172.25.2113.9123335, built on September 30, 2022
Runtime version: 11.0.13+0-b1751.21-8125866 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 3048M
Cores: 12
Registry:
external.system.auto.import.disabled=true
ide.text.editor.with.preview.show.floating.toolbar=false
ide.windowSystem.autoShowProcessPopup=true
ide.tooltip.initialDelay=695
Non-Bundled Plugins:
org.intellij.plugins.markdown (213.6777.22)
com.alibaba.p3c.xenoamess (2.1.1.5x-SNAPSHOT)
color.scheme.GapStyle (4.1)
GsonFormatPlus (1.6.1)
gradle插件版本
硬件信息
型号:JY61
- 产品出产默认为串口通讯接口波特率为9600
- 供电电源: DC12V士 10%
- 主要用于LED灯闪烁和常亮
基础知识
externalNativeBuild
build.gradle
里面有两处地方会用到externalNativeBuild
,一处在defaultConfig
里面,另一处在defaultConfig
外面。
在defaultConfig外面的externalNativeBuild里面的cmake指明了CMakeList.txt的路径或是Android.mk的路径(本章用的就是src/main/jni/Android.mk)
在defaultConfig里面的externalNativeBuild里面的cmake主要填写的是CMake的命令参数。即由arguments中的参数最后转化成一个可执行的CMake的命令。
具体操作步骤
下载NDK库
在Settings里输入SDK即可找到下图,点击下载指定的ndk包。
加入JNI相关C语言代码和mk文件
在app/src/main里创建jni目录如下图(这里先不细讲)
local.properties里配置ndk路径
ndk.dir=E\:\\AndroidStudio\\sdk\\ndk\\21.4.7075529
gradle配置
指定版本对应,版本必须相同
android {
ndkVersion "21.4.7075529"
}
配置输出的动态库文件名字和结构
defaultConfig {
...
ndk {
//输出指定三种abi体系结构下的so库。
moduleName "libserial_port"
abiFilters "armeabi-v7a", "x86"
}
}
配置externalNativeBuild
这个很重要,加入它才可以正常打包动态库。
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
打包动态库
点击Make Project,第一次编译在merged_native_libs里会生成相应的动态库。
引用第三方so库
拷贝的动态库文件夹和文件到libs目录里
在app的build.gradle加入libs配置
android {
....
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
....
成功打包apk
异常问题
引用动态库后,打包apk报错:
Execution failed for task':app:mergeApp_onlineReleaseNativeLibs'.
2 files found with path 'lib/x86/libserial_port.so' from inputs:
- D:\Demo\app\build\intermediates\merged_jni_libs\app_onlineRelease\out
- D:\Demo\app\build\intermediates\ndkBuild\app_onlineRelease\obj\local
If you are using jniLibs and CMake IMPORTED targets, see
解决方法就是注释掉如下代码即可正常打包