Android设备上直接运行C/C++程序,无需ROOT!!!

2023-05-16

在Android开发过程中难免和JNI NDK打交道做混合开发,按一般方式当交叉编译完成得到so库后,我们将so库集成到Android项目里,打包成apk安装到手机上验证运行效果。但当我们想快速在手机上验证so的功能与性能时,上面提到的传统方式就过于繁琐了。那我们能不能在Android设备上直接运行C/C++程序来直接调用so库呢?

答案是肯定的,因为我们在linux系统就可以直接运行C/C++程序,而Android系统与Linux系统的关系大家也都了解。下面来看一下具体的实现流程:

首先展示一下此demo需要用到的文件

  •  libs:存放so库
  • log.txt: 程序运行后打印的日志
  • models_sheet_phone: 模型资源文件
  • pictures: 图片资源
  • sheet_phone_test:    c++运行程序
  • testOnAndroid.sh:  运行脚本

文件准备好开始操作:

1.电脑手机连接好,需要自行安装adb环境

# 查看连接的设备
adb devices 

2.将准备好的文件push到手机

#将文件复制到Android设备目录下,选择这个路径是因为可以设置文件读写执行权限
adb push /Users/kaka/Desktop/ceshi/ /data/local/tmp

可以看到文件已经成功导入。

3.给c++可运行程序设置权限

chmod 777 /data/local/tmp/ceshi/sheet_phone_test 

4.设置查找so库路径的环境变量

export LD_LIBRARY_PATH=/data/local/tmp/ceshi/libs

如果不设置的话,会提示找不到so库的错误:

 也看到过一些文章说将自己的so文件放到系统的so默认查找路径,但此操作需要root设备,而通常我们是不想进行root操作的,因此设置环境变量就很好的解决了这个问题。

5.现在可以执行C++程序了

#第一个是c++程序,后几个是我这个执行程序所需传的参数(即 main(int argc, char** argv) 方法中的argv)
/data/local/tmp/ceshi/sheet_phone_test /data/local/tmp/ceshi/pictures/ /data/local/tmp/ceshi/models_sheet_phone 4 1080 1920 

最后就是我运行程序打印出的日志信息了。

6.为了简化操作,可以将上述命令写成脚本。

#!/bin/bash

# 运行程序,so库,模型,图片等文件路径
DATA_DIR=/Users/kaka/Desktop/ceshi/
# 复制到Android系统的路径
ANDROID_DIR=/data/local/tmp

function runInAndroidEnv(){
	
	#将准备好的文件push到Android
	adb push $DATA_DIR $ANDROID_DIR

	adb shell chmod 777 $ANDROID_DIR/ceshi/sheet_phone_test
  
    #LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径
    #执行测试程序
    adb shell "LD_LIBRARY_PATH=$ANDROID_DIR/ceshi/libs ${ANDROID_DIR}/ceshi/sheet_phone_test ${ANDROID_DIR}/ceshi/pictures/ ${ANDROID_DIR}/ceshi/models_sheet_phone 4 1080 1920 > $ANDROID_DIR/ceshi/log.txt"
    
    #导出运行日志
    adb pull $ANDROID_DIR/ceshi/log.txt $DATA_DIR
    

}


runInAndroidEnv

这样只要直接运行脚本,就可以直接得到程序执行输出的log日志文件了。

此种方案比较适合去做一些自动化测试,可以简便直观的看到我们的sdk(c/c++层)在不同机型(不同cpu)上的性能表现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android设备上直接运行C/C++程序,无需ROOT!!! 的相关文章

  • Linux C/C++之TCP / UDP通信

    目录 1 什么是网络 1 1 网络的定义 1 2 网络的实质 1 3 主机的类型 1 4 信息的传递 2 网络分层 2 1 五层模型 2 2 七层模型 xff08 OSI Open System Interconnection xff09
  • 什么是栈,栈及其特点和应用详解

    同顺序表和链表一样 栈也是用来存储逻辑关系为 一对一 数据的线性存储结构 如图 nbsp 1 所示 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp
  • 四款经典3.7v锂电池充电电路图详解 - 全文锂电池的内部结构所致,必须保留一部分锂离子在负极,锂电池不能过放电

    3 7v锂电池充电电路图 xff08 一 xff09 1 锂电池的充电 xff1a 根据锂电池的结构特性 xff0c 最高充电终止电压应为4 2V xff0c 不能过充 xff0c 否则会因正极的锂离子拿走太多 xff0c 而使电池报废 其
  • USART_ClearITPendingBith和 USART_ClearFlag的区别

    一个是清除标志 xff0c 判断中断是否处理完 一个是清除中断标志位 xff0c 根据标志位来执行相应的中断函数 一个是在入口 xff08 是否触发某个中断 xff09 xff0c 一个是在出口 xff08 是否完成某个中断 xff09 起
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数(作者自己生成的函数代码,中间有关闭接收中断,但是原子教程中没有关闭中断的语句注意区别)

    前言 1 UART Receive IT 2 HAL UART Receive 3 HAL UART Receive IT 前言 看了很长时间串口中断的HAL库 xff0c 最容易混淆的就是函数的名称 xff0c 主要集中在UART Rec
  • STM32 HAL库串口发送函数HAL_UART_Transmit()分析

    STM32 HAL库串口发送函数HAL UART Transmit 分析 硬件平台 xff1a STM32F103VET6 软件平台 xff1a STM32CubeMX 4 22 MDK 5 23 HAL库版本 xff1a FW F1 V1
  • 我在STM32单片机上跑神经网络算法

    01 前言 为什么可以在STM32上面跑神经网络 xff1f 简而言之就是使用STM32CubeMX中的X Cube AI扩展包将当前比较热门的AI框架进行C代码的转化 xff0c 以支持在嵌入式设备上使用 目前使用X Cube AI需要在
  • slambook2+ch7+orb_self 源码的一点小问题

    slambook2 43 ch7 43 orb self 源码的一点小问题 43 解读 源码详细解读小错误调试 xff0c 有的真的属实自己菜运行结果 源码详细解读 下面是一些个人的见解内联代码片 span class token comm
  • 运行相机与vins_Fusion

    安装相机的SDK git clone https github com slightech MYNT EYE D SDK git cd MYNT EYE D SDK make init make all 这里由于没有添加依赖 xff0c O
  • 无刷无霍尔BLCD电机控制

    声明 xff1a 本文出自百度文库无刷无霍尔电机控制 xff0c 因为该文为繁体 xff0c 看起来特别别扭 xff0c 特此翻译 文库网址 xff1a https wenku baidu com view b99217dca0116c17
  • stl的中常用几个容器的介绍与特点。

    lt 1 gt vector容器 vector容器是一个动态数组的结构 xff0c 在内存中有一个指针指向一块连续的内存 类似数组结构一样 它的特点支持随机访问数据 xff0c 因为其在内存中的单元是连续 如此之外 xff0c 还可以vec
  • 关闭优化选项

    这里没有调用拷贝构造函数 xff0c 按照C 43 43 机制 xff0c 应该是会调用的 想起来 xff0c 以前最初写拷贝构造函数的时候也是跟预想的调用不一致 记得编译器会自动优化掉临时对象的 比如 在一个函数中 return list
  • WIFI学习一(socket介绍)

    一 什么是socket socket译为 插座 xff0c 在计算机通信领域 xff0c socket被翻译为 套接字 xff0c 它是计算机之间进行通信的一种约定或一种方式 通过这种方式 xff0c 一台计算机可以接受其他计算机的数据 x
  • 两台电脑实现串口通信

    本文主要介绍串口传输文件的练习 将两台笔记本电脑 xff0c 借助 usb转rs232 模块和杜邦线 xff0c 建立起串口连接 然后用串口助手等工具软件 xff08 带文件传输功能 xff09 将一台笔记本上的一个大文件 xff08 图片
  • VScode前进和后退按钮,非快捷键

    在网上找了半天 xff0c 不喜欢用快捷键 xff0c 喜欢鼠标点击 xff0c 费了好长时间发现这个插件 Back amp Forth xff0c 安装后可以在右上角出现前进和后退按钮 xff0c 如下图
  • Nonce验证

    验证可能会涉及 span class token keyword def span span class token function getNonce span span class token punctuation span span
  • DJI飞行器 精准降落功能测试

    概述 xff1a 该功能仅在自动返航至起飞点 Auto RTL 时生效 xff0c 飞行器降落环境需要足够的照明和没有障碍物的区域 使用该功能后 xff0c 飞行器将使用底部的两个视觉传感器记录起飞时的地形纹理信息 xff0c 并根据记录的
  • 带学生参加电赛,5个国一,2个国二!15个省奖!

    大家好 xff0c 我是张巧龙 xff0c 转眼21年的各省电赛就结束了 xff0c 今年的电赛确实让人难忘 xff0c 不管是题目还是比赛形式 xff0c 亦或是比赛时间一拖再拖 国赛结果也在前段时间公示了 xff0c 参与人数再次增长
  • 【JAVA基础篇】内部类

    定义在一个类内部的类称为内部类 内部类访问权限可以是public protected default或private xff0c 可以声明为abstract供其他内部类或外部类继承 xff0c 可以声明为static final xff0c
  • CURL 是什么

    cURL是一个利用URL语法在命令行下工作的文件传输工具 xff0c 1997年首次发行 它支持文件上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习惯称cURL为下载工具 cURL还包含了用于程序开发的lib

随机推荐

  • STM32F103C8T6 gps串口数据处理

    基于stm32f10x系列单片机demo程序修改 配置串口 void USART1 Config void GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitSt
  • RS-485总线布线规则及方法

    摘要 xff1a 本文阐述了RS 485双向串行总线的特点 RS 485总线在实际应用中的布线规则 拓扑结构和匹配电阻的连接方法 可供有关技术人员在RS 485总线设计和施工时做参考 关键词 xff1a RS 485 总线 规则 方法 前言
  • jetson nano 基础设置

    关闭图像界面 span class token function sudo span systemctl set default multi user target 开启图像界面 span class token function sudo
  • Android JNI Java/C++互相调用

    一 xff0c Java 调用 C 1 xff0c 首先我们创建一个文件名字叫做 xff0c JNI 其实你不创建也行 看自己 public class JNI 加载本地C语言文件库 库名字为你写的C语言文件名 static System
  • STM32串口空闲中断,中断标志位无法清除

    本节目录 今天想使用STM32的串口空闲中断作接收 xff0c 调了1个小时 xff0c 发现串口空闲中断无法被清除 xff0c 网上搜索半天发现 xff0c 能用清除的库函数清除该中断 我又回头看了一下手册 果真如此 xff0c 问题已解
  • CMake系列(八) CMake 多级目录

    CMake系列 xff08 八 xff09 CMake 多级目录 文章目录 CMake系列 xff08 八 xff09 CMake 多级目录目录结构结构说明调用关系 源文件CMakeLists txt最外层CMakeListsmain的CM
  • 【全国一等奖】F题:智能送药小车,2021年全国大学生电子设竞赛

    01 前 言 大家好 xff0c 我是张巧龙 xff0c 今天给大家带来关于21年F题的分享 xff1a 智能送药小车 xff0c 出了这个题目之后 xff0c 咋一看 xff0c 好像比较简单 不过大家慢慢做 xff0c 越往后做越发现
  • ZYNQ系列(十二)linux的DMA使用

    ZYNQ系列 xff08 十二 xff09 linux的DMA使用 文章目录 ZYNQ系列 xff08 十二 xff09 linux的DMA使用前言开发环境准备工作petalinux工程建立建立工程配置内核1 配置DMA2 配置CMA 修改
  • gtest学习笔记(四)gtest自带的sample3---Test Fixture减少测试冗余

    文章目录 前言源码学习utest语法运行 前言 第一章中已经编译出自带的sample例子 xff0c 在build googletest目录下可以看到sample的各种例子的可执行程序 Google Test 附带了10个单元测试用例 xf
  • VSCODE 系列(六)使用Plantuml插件制作UML类图

    文章目录 前言下载和安装支持文件格式支持绘制类型导出 语法申报要素UML类图关系参考例子参考 前言 软件设计中 xff0c 有好几种图需要画 xff0c 比如流程图 类图 组件图等 xff0c 我知道大部分人画流程图一般都会用微软的visi
  • MDK配色方案更改

    文章目录 WIN10更改护眼背景MDK软件配色方案更改 设置常用关键字参考 WIN10更改护眼背景 按windows 43 R快捷键 xff0c xff0c 打开运行 xff0c 在弹出来的输入框中写上regedit xff0c 点确定或回
  • VSCODE 系列(七)格式化工具clang-format

    文章目录 一 VS Code中使用生成 clang format文件VS Code设置 参考 一 VS Code中使用 VS Code 中自带clang format exe 生成 clang format文件 使用命令 span clas
  • MDK的格式化代码工具及添加快捷方式

    文章目录 Astyle介绍插件安装参数设置格式化整个工程参数说明快捷键设置参考 Astyle介绍 Astyle 即Artistic Style xff0c 是一个可用于C C 43 43 C 43 43 CLI Objective C C
  • cURL命令详解

    cURL是什么 cURL是用于数据传输的命令行工具 xff0c 支持多种传输协议 xff0c 包括HTTP HTTPS SCP FTP SFTP TELNET FILE SMTP POP3等等 可以使用cURL进行HTTP HTTPS请求
  • 关于单片机栈空间的总结

    1 如果定义成全局数组 xff0c 则此数组就会自动初始化为0 但如果定义成局部数组 xff0c 则必须要先初始化 2 局部变量一定要初始化 局部变量初始化 是指在使用这个局部变量前 xff0c 要对其进行初始化 这是因为局部变量是从内存堆
  • rplidar使用

    rplidar的使用 新上手的激光雷达 xff0c 第一次使用 根据网上的教程 xff0c 先搭建环境跑起来 安装rviz sudo apt get install ros kinetic rviz 通过apt get安装rviz xff0
  • 全国一等奖,H题:用电器分析识别装置

    大家好 xff0c 我是张巧龙 xff0c 今天继续给大家带来电赛题目 xff1a 用电器分析识别装置 01 视频展示 全国一等奖 21年电赛H题 xff1a 用电器分析识别装置 02 方案设计 2 1 系统总体方案 通过对赛题的仔细分析研
  • jetson-tx2-nx用户空间无法导出gpio

    1 想要导出gpio xff0c 结果如下 xff0c 导出失败 xff0c 显示gpio忙 2 查看占用状态 xff0c 发现这个脚被用成了其他功能 3 如果没有第二步的那个目录 xff0c 则执行以下语句 xff0c mount t d
  • cmake添加已编译的.a静态库

    在main下新建一个lib文件夹 将编译好的xxx a放入lib文件夹 打开main下的CMakeLists txt 添加下面两条代码 add prebuilt library prebuilt 34 lib xxx a 34 libm t
  • Android设备上直接运行C/C++程序,无需ROOT!!!

    在Android开发过程中难免和JNI NDK打交道做混合开发 xff0c 按一般方式当交叉编译完成得到so库后 xff0c 我们将so库集成到Android项目里 xff0c 打包成apk安装到手机上验证运行效果 但当我们想快速在手机上验