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

news2024/10/5 18:28:32

文章目录

目录

文章目录

基础信息

我的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,第一次编译在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

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

 最终效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么要使用微服务架构?【微服务架构出现的背景】

随着互联网技术的发展,传统的应用架构已满足不了实际需求,微服务架构就随之产生。那么传统应用架构到底出了什么问题呢?又如何解决?接下来我们将从传统单体架构的问题开始,对为什么需要微服务架构进行详细讲解。传统单体应用架构的问题通常…

钓鱼网站+persistence植入后门程序+创建用户

本实验实现1: 利用MS14-064漏洞,会生成一个网址,诱导用户点击,打开后,会直接连接到发起攻击的主机上,即可攻击成功。 本实验实现2: 一旦入侵成功,则拿到控制目标主机的部分权限&…

春种一粒粟:企业如何修炼好云原生内功?

日月盈昃,辰宿列张。寒来暑往,秋收冬藏。《千字文》里蕴藏了一种人与天地之间共处的智慧,那就是想要收获粮食,一定要提前播种。农耕如此,百业如此,数字化创新也是一样。数字化技术,已经成为全球…

速来!掘金数据时代2022年度隐私计算评选活动火热报名中!

开放隐私计算 开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号…

一月券商金工精选

✦研报目录✦ ✦简述✦ 按发布时间排序 国盛证券 “薪火”量化分析系列研究(二)-票据逾期数据中的选股信息 发布日期:2023-01-04 关键词:股票、票据、票据预期 主要内容:本文深入探讨了“票据持续逾期名单”这一…

CentOS7.6 MySQL8安装

1 检查是否安装过 MySQL rpm -qa | grep -i mysqlmariadb rpm -qa | grep mariadb2 卸载之前的安装 MySQL rpm -e --nodeps 软件名 //强力删除,对相关依赖的文件也进行强力删除卸载 rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_643 官网下载 MySQL :: D…

kettle简单使用-将CSV转换为Excel文件_操作过程---大数据之kettle工作笔记003

做个例子把csv转换为xls文件 可以看到过程 首先右键文件 新建 转换 然后选择核心对象 输入 CSV文件输入 然后选择输出excel输出,拖拽过来 然后按住shift 然后鼠标左键,然后拉出一条线到输出 然后松开的

关于ctf中flask算pin总结

什么是pin码 pin码是flask在开启debug模式下,进行代码调试模式所需的进入密码,需要正确的PIN码才能进入调试模式,可以理解为自带的webshell pin码如何生成 pin码生成要六要素 1.username 在可以任意文件读的条件下读 /etc/passwd进行猜测 2.modname 默…

硬件系统工程师宝典(10)-----了解PI分析目标,电源完整性设计“有章可循”

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。上篇我们说到在电源完整性分析时,如何合理使用去耦电容,知道了对于不同频率的信号噪声采用不同类型的去耦电容。今天我们来看…

【蓦然回首忆Java·基础卷Ⅰ】

文章目录开端通过引用创建对象Java的数据存储方式基本类型包装类和高精度数字操作符自动递增和自动递减老生常谈的问题:和equals()如何重写equals方法?短路字面量科学计数法位运算类型转换初始化和清理方法的重载方法的重写无参构造器this与构造器垃圾收…

51-52 - 进程状态设计

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 问题2. 进程状态设计2.1 任务生命周期2.2 任务的状态2.3 任务的生命周期与状态切换2.4 状态切换概要设计2.4.1 核心数据结构>内核队列2.4.2 KillTask() 实现思路2.4.3 整体实现规划2.4.4 编程实验:任务生命周期状态…

字节跳动DevOps交付流程演进之路

近年来,各企业都已在实践 DevOps 的流程、方法和工具,来提升业务价值交付的效率。不同企业的业务团队背景和基础各不相同,因此都在走自身的 DevOps 之路,往往伴随着成功的经验和失败的教训,了解和学习不同背景下的 Dev…

Qt 某光谱仪程序开发

某光谱仪程序开发 文章目录某光谱仪程序开发摘要安装驱动注册COM组件导出.h和.cpp在Qt 中添加源文件开发打包程序关键字: Demo、 Qt、 COM、 dumpcpp、 C摘要 今天接到一个临时小任务,写一个的项目子模块的Demo,以供和专家们交流一下项目技…

游戏蓝牙耳机什么牌子好?游戏蓝牙耳机性价比品牌

为了提升游戏体验,多数人都会选购一副蓝牙耳机,在网上找了当前热销的蓝牙耳机,终于整理出了当前热销性价比高的蓝牙耳机品牌,今天就带大家一起看看这几款耳机的优点,希望这篇文章能帮助大家选择。 一、南卡小音舱蓝牙…

JavaScript随手笔记---对比数组差异

💌 所属专栏:【JavaScript随手笔记】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#…

Mybatis源码分析系列之第二篇:Mybatis的数据存储对象

前言:SQLSession是对JDBC的封装 一:SQLSession和JDBC的对照说明 左边是我们的客户端程序,右边是我们的MySQL数据仓,或者叫MySQL实例 Mybatis是对JDBC的封装,将JDBC封装成了一个核心的SQLSession对象 JDBC当中的核心对…

【IoT】做短视频之前,你需要先做好内容定位

现在做内容无疑要从垂直领域入手,否则你就很难出圈。 干货类或者说垂直领域方向的内容,往往都偏向于枯燥,并且会涉及很多专业性的名词,读者理解起来会困难很多,阅读的兴趣也自然会降低。 这也是笔者个人开始做短视频…

分析过程:服务器被黑安装Linux RootKit木马

前言 疫情还没有结束,放假只能猫家里继续分析和研究最新的攻击技术和样本了,正好前段时间群里有人说服务器被黑,然后扔了个样本在群里,今天咱就拿这个样本开刀, 给大家研究一下这个样本究竟是个啥,顺便也给…

linux系统开机文段释义

第一段Version 2.01.1204. Copyright (C) 2010American Megatrends, Inc.Press <DEL> or <F2> to entersetup. Press <F7> for BBS POPUP Menu.设备上电&#xff0c;提示按DEL键或者F2键进入BIOS设置。按F8可以调出启动设备列表&#xff0c;可以选择性的启动…

软件工程 | 第一章:软件工程学概述

软件工程学概述一、前言二、软件危机1.典型表现2.产生原因3.消除危机途径三、软件工程1.概述2.软件本质特征3.软件工程基本原理4.软件工程方法学1️⃣传统方法学2️⃣面向对象方法学四、软件生命周期五、结语一、前言 本文将讲述软件工程导论的第一章相关知识点&#xff0c;主…