使用NDK编译C/C++文件生成在安卓中的可执行文件

2023-11-19

使用NDK编译C/C++文件生成在安卓中的可执行文件

需求:

要编译一个C文件,然后将他运行到安卓手机中,通过这个可执行文件可以获取一些硬件的参数信息,或者对已经有的信息进行修改,从而达到我们想要的效果

相关知识点记录:

  1. NDK:Native Development Kit,是 Android 的一个工具开发包。NDK 可以看做是 Android 中实现 JNI 的一种手段,通过 NDK,还可以打包 C/C++ 动态库,并自动打包进 APK/AAR 中。我们可以到安卓官网下载NDK,可以直接执行NDK命令,也可以集成NDK到AndroidStudio中编译C/C++文件。

  2. JNI:Java Native Interface,即 Java 本地接口。使得 Java 与本地其他类型语言(如 C、C++)交互。也就是在 Java 中调用 C/C++ 代码,或者在 C/C++ 中调用 Java 代码。JNI 是 Java 的,和 Android 无关。

  3. .SO文件:so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据。一般来说.so文件就是常说的动态链接库, 都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码)。Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库。

  4. Android.mk :文件位于项目 jni/ 目录的子目录中,用于向编译系统描述源文件和共享库。它实际上是编译系统解析一次或多次的微小 GNU makefile 片段。Android.mk 文件用于定义 Application.mk、编译系统和环境变量所未定义的项目范围设置。它还可替换特定模块的项目范围设置。Android.mk 的语法支持将源文件分组为模块。模块是静态库、共享库或独立的可执行文件。

使用最原始的方法编译C/C++文件

1,创建.c/.cpp文件,我们拿我们拿我们自己已经有的文件当例子(ilitek_TDDI.c文件),建议创建一个单独的文件夹用来编译执行ndk命令。我们存放在D:/DEMO临时文件夹下面。

2,新建两个文件Android.mk和Application.mk,然后分别按照如下代码对Android.mk文件和Application.mk文件进行编辑。

#Adroid.mk文件内容

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)          #会清理除了LOCAL_PATH歪的其他LOCAL文件路径
LOCAL_CFLAGS += -std=c99       #使用c语言c99规范
LOCAL_CFLAGS += -pie -fPIE     #相当于在源文件中增加宏定义,安卓5.0以上需要添加,否则编译出来无法使用
LOCAL_LDFLAGS += -pie -fPIE    #相当于在源文件中增加宏定义,安卓5.0以上需要添加,否则编译出来无法使用
LOCAL_ARM_MODE := arm          #模块指令集
LOCAL_MODULE    := TestNdk     #模块名称(最后生成的可执行文件的名字,可以按照需求修改)
LOCAL_SRC_FILES := TestNdk.c   #源文件名(需要替换成我们自己的.c文件)
include $(BUILD_EXECUTABLE)    #编译为可执行文件
#Application.mk文件内容

APP_ABI := x86 armeabi-v8a

APP_ABI是指明编译与调试的CPU架构。

目前Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x86(从2011年),MIPS(从2012年),ARMv8,MIPS64和x86_64(从2014年),每一种都对应相应的ABI。相应生成arm64-v8a,mips64,x86_64下的文件需要NDK_r10以上版本支持。在Application.mk文件里配置APP_ABI的内容。

根据不同的NDK版本,APP_ABI := all仅能生成当前版本支持的ABI信息库文件,如果需要生成最新的必须更新相应的NDK版本。

或者明确写明支持的CPU架构APP_ABI := armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64

注意:由于目前版本支持的问题,采用Eclipse+NDK+Windows集成方式开发,对应编译生成对应CPU架构的so文件是没有问题的。但是不一定可以执行调试工作,启动NDK调试模式时将会提示无法识别对应的ABI。

注意:

(1)、目前模拟器只有x86_64的没有arm64-v8a的;
(2)、在用真机测试armv8-a时,最好先通过adb shell, cat /proc/cpuinfo ,来查看下真机是否是支持armv8-a;
(3)、arm32和arm64有些配置参数不能共存,如-msoft-float仅在arm32位下支持,在arm64位下是不支持的.

3,打开CMD切换到NDK解压路径下面(含有ndk-build.cmd等文件的目录),在这个目录下面可以使用命令ndk-build。也可以通过配置环境变量的方式,这样可以在任何路径下面执行ndk-build命令,配置环境变量的过程此处不再赘述。

4,在CMD窗口下面输入下面的命令。

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk

# ndk-build是执行命令的关键字
# NDK_PROJECT_PATH是你的工程存放的路径,比如我放在了D盘的DEMO文件夹下面,就是D:/DEMO
#APP_BUILD_SCRIPT是你的Android.mk文件存放的地方。一般情况下我们都会将工程文件和mk文件存放在一起,所以路径和上述路径一致,在后面加上Android.mk即可。

5,点击回车后执行,会发现在我们的工程路径下面会多出来两个文件夹,一个是libs,另一个是obj。

6,其中libs文件夹下面会按照不同的架构生成不同的文件夹,根据我们的设备的实际情况,找到合适的文件夹打开,可以找到可执行文件(TestNDK),这个文件的名字是我们在Android.mk文件下面定义好的。

7,然后我们就可以将这个文件push到设备上面,执行我们定义好的内容。

在这里插入图片描述

下面是通过程序获取info信息的脚本文件内容

adb push TestNdk /data/local/tmp                   #将文件TestNdk推送到/data/local/tmp目录下
adb shell chmod 777 /data/local/tmp/TestNdk		   #修改文件TestNdk的权限为777
adb shell ./data/local/tmp/TestNdk				  #执行文件TestNdk

#可以以此执行以下代码查看文件是否发送成功。
#adb shell
#su
#cd /data/local/tmp
#ls

将以上内容保存到bat格式的文件中,然后pc连接设备,将上述脚本文件和已经编译好要执行的文件,复制到adb所在文件夹下,双击bat文件执行。就可以在命令窗口得到相关的设备信息。

如果在执行之后发现cmd命令框输出的结果是乱码,原因是由于CMD控制台所使用的代码页和TestNdk的代码页不匹配导致的,TestNdk使用的是UTF-8编码,而CMD控制台默认使用的GBK编码。

修改CMD窗口的默认代码页为UTF-8编码即可,我们新建一个CMD窗口,输入命令chcp 65001,意思是修改CMD的代码页为65001,65001就是UTF-8编码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用NDK编译C/C++文件生成在安卓中的可执行文件 的相关文章

随机推荐

  • macbook百度网盘下载保存的文件在哪❓找不到

    困扰我好久的问题终于被我解决了 之前在AppStore里下载百度网盘 然后在百度网盘里下载文件 除了能直接打开以后 怎么都找不到文件位置 后来我终于知道了 是因为在AppStore里下载的百度网盘根本不是mac版的 如果你想下载mac版的百
  • 安卓TabLayout的使用

    安卓TabLayout的使用 我们在进行安卓开发时 常常会使用到ViewPager 为了展示更美观的效果 我们经常会选择第三方的诸如TabPageIndicator等配合ViewPager使用 但是TabPageIndicator已经很老了
  • 简单地使用webpack进行打包

    下面的webpack是4 14 0版本的 当时我学的 更新太快了 现在5 10 0了 你学习的时候 用的是最新的 就不要往下看啦 官方文档已经更新教程了 这是我看5 10 0教程后 简单搭建的打包demo 可以参考 或者你也自己去官网看文档
  • SpringCloud-Alibaba Nacos

    Nacos 简介 为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母 最后的s为Service 是什么 一个更易于构建云原生应用的动态服务发现 配置管理和服务管理平台 Nacos Dynamic Nam
  • STM32的串口中断详解

    目录 中断配置 中断服务函数 1 中断服务函数名称查找 2 中断服务函数 3 可以选择的串口中断类型 extern u8 USART RX BUF USART REC LEN extern u16 USART RX STA 中断配置 使能接
  • js 字符串拼接的4种方法

    一 使用连接符 把想要连接的字符串串起来 let shy 帅哥 let a 我是 shy console log a 我是帅哥 二 模板字符串 模板字符串 template string 是增强版的字符串 用反引号 标识 特点 1 字符串中
  • 20221129-1Spring_day03(资料来自黑马程序)

    Spring day03 今日目标 理解并掌握AOP相关概念 能够说出AOP的工作流程 能运用AOP相关知识完成对应的案例编写 重点掌握Spring的声明式事务管理 1 AOP简介 前面我们在介绍Spring的时候说过 Spring有两个核
  • 【HTML】修复选中项与实际后台控制的选中项不一致的问题

    项目场景 项目场景 系统项目中有一个需要通过后台传递选中项的下拉项 由于反复确认都无法主动更新 考虑到其他人推荐的 方法 也是没有效果的 例如 无效
  • 首个数字银行卡明年发行,广州出台区块链措施支持大湾区

    锌链接作为首个提出产业区块链的机构媒体 一直积极推动产业区块链落地 通过深度报道直戳行业痛点 通过分享会聆听行业声音 通过周报呈现行业大观 通过评论展现独特产业观察视角 本周 广州出台66条措施支持粤港澳大湾区金融发展 其中多项与区块链有关
  • CVPR 2023和ICLR 2023异常检测相关文章

    关键词 Anomaly Detection Outlier Detection Out of Distribution Abnomal Detecting Abnormal Detection Defect DetectionInspect
  • 两万字整理Fabric(超级账本) 配置文件 掌握了它就掌握了Fabric的核心

    导语 文章没有重复的地方 没有废话 如果能帮助到你 那是我的荣幸 记得一键三连哟 Fabric 配置文件详解 一 四个核心配置文件 二 Fabric 的核心配置文件 三 网络启动步骤 1 生成认证证书 crypto config yaml
  • JS 时区时间转换

    业务场景 页面服务器时间是东八区时间 页面 JS 功能需要对比服务器时间和用户本地时间 为兼容世界各地时间 需要将用户本地时间转换为东八区时间 基本概念 格林威治时间 格林威治子午线上的地方时 或零时区 中时区 的区时叫做格林威治时间 也叫
  • cocos2d-x 之 适配分辨率全屏的方法

    原文出处 https blog csdn net yixiao3660 article details 54316348https www jianshu com p 0d6787e31112 http dualface github io
  • 从架构师的角度看服务器端架构点滴

    任何服务器端的架构设计 都是性能 一致性和成本三者的权衡 从我在目前的大规模互联网视频公司的负责APP服务器端的角度来讲 我主要关注以下几个点 业务 可靠性 性能 可维护性 一 业务 框架上保证业务的快速迭代 在性能要求不高的情况下 同步架
  • ubuntu 安装 python3.9

    一 相关背景 之前在dockerfile里面一直使用的是python3 8 忘记为什么选择这个版本了 想用python3 9 因为觉得3 8有点老了 而且3 9一个重要的feature 是把list作为默认的类型 不需要从typing 里面
  • 微信公众号实现微信支付(含前后端完整代码)

    刚做完公众号微信支付 记录一下 获取微信支付之前 要先获取用户的基本信息哦 前端使用uniapp开发的H5 小伙伴们可以照着改一下对应语法 首先来个微信支付的工具类 wxApi js 这里我放到了项目下的common目录下 代码如下 微信
  • Vue控制台警告: Added non-passive event listener to a scroll-blocking ‘touchmove‘ event. Consider markin

    翻译过来如下 违反 没有添加被动事件监听器来阻止 touchstart 事件 请考虑添加事件管理者 passive 以使页面更加流畅 原因是 Chrome51 版本以后 Chrome 增加了新的事件捕获机制 Passive Event Li
  • 修改vscode默认打开两个标签窗口

    vscode 默认打开两个标签窗口 设置能同时打开多个标签 打开以下这个路径C Users xx AppData Roaming Code User 在setting json中添加一行设置 workbench editor enableP
  • android获取view宽高的时机

    关键点 获取宽高应该在view的onLayout之后 这个时候 view已经确定算出宽高 error 在onCreate onResume方法中调用 用于获取TextView的宽度和高度都是0 private void getTextHei
  • 使用NDK编译C/C++文件生成在安卓中的可执行文件

    使用NDK编译C C 文件生成在安卓中的可执行文件 需求 要编译一个C文件 然后将他运行到安卓手机中 通过这个可执行文件可以获取一些硬件的参数信息 或者对已经有的信息进行修改 从而达到我们想要的效果 相关知识点记录 NDK Native D