Android的NDK之编译LED的动态库so和使用so

文章目录

目录

文章目录

基础信息

我的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

  1. 产品出产默认为串口通讯接口波特率为9600
  2. 供电电源: DC12V士 10%
  3. 主要用于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,第一次编译在app\build\intermediates\merged_native_libs里会生成相应的动态库。

 

 引用第三方so库

 拷贝的动态库文件夹和文件到libs目录里

在app的build.gradle加入libs配置

android {
....
sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
}
....

代码引用动态库:System.loadLibrary("serial_port"); //非常重要

最后就是打包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

 解决方法就是注释掉如下代码即可正常打包

 最终效果展示

猜你喜欢

转载自blog.csdn.net/piyangbo/article/details/129126972