【软件教程】如何用C++交叉编译出能在Android运行的ELF程序或so动态库

news2024/12/24 11:39:01

一、配置NDK交叉编译平台

1. 打开Android的官方ndk下载链接https://developer.android.com/ndk/downloads?hl=zh-cn,下载windows 64位ndk环境包。

2. 解压后将具有以下文件的路径加入到系统环境变量。

3. 配置好环境变量,如下图所示,Path中存在第2步中的路径。

4. 重启电脑,在终端中输入ndk-build,如果能够看到路径说明配置正确。

二、编写C++程序或动态库 

1. 创建文件夹和文件,对应的文件树如下,最外层文件夹名可自定。

2. /my_android_hook/jni/Android.mk代码如下,如果需要构建动态链接库,则使用"include $(BUILD_SHARED_LIBRARY)",如果需要构建可执行程序,则使用"include $(BUILD_EXECUTABLE)"。

# 获取当前目录路径并赋给 LOCAL_PATH 变量
LOCAL_PATH:=$(call my-dir)
# 包含清除变量指令
include $(CLEAR_VARS)
# 设置本地模块的名称为 "hook_crackme1"
LOCAL_MODULE := hook_crackme1
# 指定源文件为 "hook.c"
LOCAL_SRC_FILES := hook.c
# 添加日志库依赖
LOCAL_LDLIBS += -llog
# 包含构建共享库的指令
# include $(BUILD_SHARED_LIBRARY)
# 包含构建可执行文件的指令
include $(BUILD_EXECUTABLE)

3. /my_android_hook/jni/Application.mk代码如下。

# 指定编译生成的模块文件支持的 CPU 架构,这里选择 armeabi-v7a。
APP_ABI := armeabi-v7a
# 指定编译生成的模块文件运行支持的 Android 版本,这里选择 android-21。
APP_PLATFORM := android-21
# 指定使用的 C++ 标准库,这里选择 c++_static。
APP_STL := c++_static

4. /my_android_hook/jni/hook.c代码可以自己写,也可以是.cpp文件。

5. 在/my_android_hook/ 路径下运行命令行ndk-build,如果第3步选的是BUILD_SHARED_LIBRARY动态库,在没有error的情况下应该可以看到如图结果。so文件在libs/armeabi-v7a/{链接库名}.so。

6. 如果第3步选的是BUILD_EXECUTABLE可执行文件,在没有error的情况下应该可以看到下图结果,可执行文件在libs/armebi-v7a/{文件名}。

三、测试运行ELF可执行程序

1. 用ADB连接真机或者模拟器。(真机用开发者选型->usb调试,模拟器将端口号改为模拟器adb端口)

2. 将ELF程序push到android设备的/data/local/tmp路径下。

3. 使用终端命令行adb shell进入android shell,并使用su命令获取root权限。

4. cd到/data/local/tmp路径,使用命令chmod +x {文件名}将ELF程序修改为可执行。

5. 使用命令./{文件名}运行ELF程序。(如果输出太多,也可以使用./{文件名} >1.txt将输出保存到1.txt文件里,然后使用cat 1.txt或者head -n 10 1.txt查看输出)

6. 如果运行结果与预想一致,说明编译出的ELF程序可以在目标平台运行,如果出现问题,可能是Application.mk文件指定的APP_PLATFORM版本或者APP_ABI与目标平台不一致。

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

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

相关文章

mysql 数据库 表结构生成word文档

1、背景 我们在做项目时,表设计文档都是非常重要的,可以让开发人员快速了解表与业务的关系、表之间的关系。 产品在不停迭代的过程中,表的结构也会有相应的变化,我们需要将变化更新的表设计文档中。以前我们是人工方式更新文档&…

C++ 虚函数详解:多态性实现原理及其在面向对象编程中的应用

在面向对象的编程中,多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时,可以产生不同的行为。C是一种面向对象的编程语言,在C中,虚函数是实现多态性的关键 什么是虚函数 虚函数是一个在基类中声明的函数&…

基于SpringBoot的时间管理系统

基于SpringBoot的时间管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 用户界面 摘要 基于Spring Boot的时间管理系统是一款功能丰富…

【Redis安装】Ubuntu和Centos

此处安装的是 Redis5 在 Ubuntu 系统上 切换到 root 用户下,su 命令切换使用 apt 可以搜索 redis 相关软件包 apt search redis使用 apt 命令安装 redis apt install redis手动修改配置文件 redis.conf cd /etc/redis/ vim redis.conf修改以下两处 重启服务器 …

2021年下半年 软件设计师 上午试卷(1-28)

计算机指令系统采用多种寻址方式。立即寻址是指操作数包含在指令中,寄存器寻址是指操作数在寄存器中,直接寻址是指操作数的地址在指令中。这三种寻址方式获取操作数的速度 (1) 。 (1) A. 立即寻址最快&am…

【JAVA学习笔记】43 - 枚举类

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter11/src/com/yinhai/enum_ 〇、创建时自动填入版权 作者等信息 如何在每个文件创建的时候打入自己的信息以及版权呢 菜单栏-File-setting-Editor-File and Code Templaters -Includes-输入信…

SpringBoot整合Activiti7——任务监听器(七)

文章目录 一、任务监听器事件类型配置方式(选)代码实现xml文件创建监听器class方式expression方式delegateExpression 测试流程部署流程启动流程完成任务 一、任务监听器 任务监听器可以在任务创建、任务分配、任务完成、任务删除发生时触发,从而执行相应的逻辑。 事…

rust学习——方法 Method

文章目录 方法 Method定义方法self、&self 和 &mut self方法名跟结构体字段名相同 带有多个参数的方法关联函数多个 impl 定义为枚举实现方法 rust 结构体与枚举的区别回答1回答2 方法 Method 从面向对象语言过来的同学对于方法肯定不陌生,class 里面就充斥…

nginx 动静分离 nginx防盗链

一、动静分离环境准备静态资源配置(10.36.192.169)安装nginx修改配置文件重启nginx 动态资源配置(192.168.20.135)yum安装php修改nginx配置文件重启nginx nginx代理机配置(192.168.20.134)修改nginx子自配置文件重启nginx 客户端访问 二、防盗链nginx防止…

【proteus】8086仿真/汇编:创建项目并添加汇编代码文件

1.创建好新项目 2.点击source code 弹出VSM 3. 4.注意两个都不勾选 可以看到schematic有原理图出现 5. 再次点击source code 6.project/project settings,取消勾选embed 7. add 8.输入文件名保存后: 注意:proteus不用写dos的相关语句 。

内存CACHE同步引起OSD时间戳显示异常

目前在用的这款芯片,图像翻转有专门的一个图像处理IP来完成,同时这个IP又支持叠加OSD的功能,但是在设计的时候叠加OSD的功能单元又在图像翻转单元的前面,导致了开启了图像翻转功能后,OSD就倒着显示、位置不在原来的坐标…

vue3 computed 和 watch 的差异

目录 前言 用法 computed watch 代码 理解 高质量的使用 Vue.js作为一种现代化的前端框架,提供了丰富的特性来帮助开发者构建高效和响应式的用户界面。在这其中,computed 和 watch 是两个非常重要的选项,它们都用于处理数据的变化&…

VUE到底有什么好处?

网上有许多前端开发框架的对比,相对的,VUE在综合评分方面还是优秀的。以下是一些State of JavaScript调查数据结果: 使用率:VUE使用者在调研开发者中占比 51%; 开发者满意度:VUE的综合开发者满意度达到64%…

【算法练习Day27】买卖股票的最佳时机 II跳跃游戏跳跃游戏 II

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 买卖股票的最佳时机 II跳跃…

智能视频监控平台EasyCVR接口调用注意事项汇总!

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

汽车4S店如何在数字化管理下,提高市场竞争力

在所有人都认为疫情过后,经济形势会一路向阳,但是,实际情况出乎所有人的意料,各行各业举步维艰。 新闻爆出的各大房地产,恒大的2.4万亿让人瞠目结舌,还有碧桂园和融创,也是债台高筑了&#xff…

Access denied for user ‘root‘@‘localhost‘ (using password:YES) 解决方案(禅道相关)

如果是忘记Mysql密码或更改权限后访问不了的问题请直接跳转以下链接: MySQL登录时出现Access denied for user ‘root‘‘localhost‘ (using password: YES)无法打开的解决方法 关于这个问题,网上查到的解决方法基本都是因为忘记Mysql密码或者用户权限问…

利用Jpom在线构建Spring Boot项目

1 简介 前面介绍了运用Jpom构建部署Vue项目,最近研究了怎么部署Spring Boot项目,至此,一套简单的前后端项目就搞定了。 2 基本步骤 因为就是一个简单的自研测试项目,所以构建没有使用docker容器,直接用java -jar命令…

Go语言入门心法(十三): 反射认知升维

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…

图像数据增强算法汇总(Python)

一、数据增强概述 数据增强是一种通过使用已有的训练样本数据来生成更多训练数据的方法,可以应用于解决数据不足的问题。数据增强技术可以用来提高模型的泛化能力,减少过拟合现象。比如在狗猫识别项目中,通过随机旋转、翻转和裁剪等数据增强…