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

一、配置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.rhkb.cn/news/169635.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用GoogleNet网络实现花朵分类

一.数据集准备 新建一个项目文件夹GoogleNet,并在里面建立data_set文件夹用来保存数据集,在data_set文件夹下创建新文件夹"flower_data",点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/exampl…

推荐几个程序员必逛的个人技术博客网站

1、美团技术团队 地 址: 美团技术团队简 介:美团技术团队的博客,干货满满。推荐指数:⭐⭐⭐⭐⭐ ​ 2、阮一峰的网络日志 地 址: 阮一峰的个人网站 - Ruan YiFengs Personal Website简 介:大神阮一峰,博客风格真正…

PHP 在线考试管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 PHP 在线考试管理系统是一套完善的web设计系统 layUI技术布局 ,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 PHP 在线考试系统1 代码 https://download.csdn.net/download/qq_41…

【31】c++设计模式——>模板方法模式

模板方法模式通常由以下几个部分组成: 1.抽象基类(Abstract Base Class):抽象基类定义了一个算法的骨架,其中包含了模板方法和一些基本操作方法。模板方法在抽象基类中被声明为虚函数,它定义了算法的流程&…

制作macOS Ventura U盘启动盘教程

macOS 14更新一段时间了,发现某些应用不适配想要无损降级,如何进行macOS的降级呢,除了备份好的时间机器备份,还需要一个可以引导的macOS U盘安装器,如何制作macOS 13 Ventura 系统启动U盘呢,小编带来对新手…

线性表操作的实现--顺序表

本文参考朱战力老师的数据结构与算法--使用C语言一书 文章目录 前言 一、线性表是什么? 二、具体实现 1.顺序表的定义 2.初始化ListInitiate(L) 3.求当前元素个数ListLength(L) 4.插入元素ListInsert(L&…

Ubuntu deadsnakes 源安装新版 python

前言 适用于 Ubuntu 安装 python3.11 等新版本。 因为比较常用并且不想重新编译就记录一下,方便以后面向CV安装。 安装 添加 deadsnakes ppa 源 sudo add-apt-repository ppa:deadsnakes/ppa更新 apt sudo apt update安装 python3.11 sudo apt install python…

电子元器件管理系统 JAVA语言开发

目录 一、系统介绍 二、系统下载 三、系统截图 一、系统介绍 基于VueSpringBootMySQL的电子元器件管理系统包含元器件单位模块、元器件仓库模块、元器供应商模块、元器件品类模块、元器件明细模块、元器件采购模块、元器件采购审核模块、元器件领用模块、学生元器件申请模块…

【华为路由器】配置企业通过5G链路接入Internet示例

场景介绍 5G Cellular接口是路由器用来实现5G技术的物理接口,它为用户提供了企业级的无线广域网接入服务,主要用于eMBB场景。与LTE相比,5G系统可以为企业用户提供更大带宽的无线广域接入服务。 路由器的5G功能,可以实现企业分支…

KNN(K近邻)水仙花的分类(含答案)

题目 以下采用K-NN算法来解决水仙花的分类问题,每个样本有两个特征,第一个为水仙花的花萼长度,第二个为水仙花 的花萼宽度,具体数据见表, 1)设置k3, 采用欧式距离,分析分类精度为多少…

【Linux系统编程:信号】产生信号 | 阻塞信号 | 处理信号 | 可重入函数

写在前面 通过学习信号可以理解进程与进程的一个相对关系,还能理解操作系统与进程的关系。要注意的是进程间通信中的信号量与这里的信号没有半毛钱关系,就像老婆和老婆饼。 本文要点: 掌握 Linux 信号的基本概念掌握信号产生的一般方式理解…

树与二叉树(考研版)

文章目录 树与二叉树树的基本概念结点、树属性的描述树的性质 二叉树的概念二叉树的性质二叉树的构建二叉树的遍历先序遍历中序遍历后序遍历层次遍历 递归算法和非递归算法的转换源代码 线索二叉树二叉树的线索化线索二叉树 找前驱/后继 树和森林树的存储 树与二叉树的应用哈夫…

JavaScript快捷方式:15个简写技巧,让你的代码事半功倍!

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

依靠继承与聚合,实现maven搭建分布式项目

简介聚合 对于复杂的Maven项目,一般建议采用多模块的方式来设计开发,便于后期维护管理。但是构建项目时,如果每次都需要按模块一个一个进行构建会十分麻烦,而Maven的聚合功能就可以很好的解决这个问题,当用户对聚合模…

Ubuntu22.04安装,SSH无法连接

Ubuntu初始化安装后,系统默认不允许root通过ssh连接,因此需要完成三个设置 1.修改ssh配置文件 vim /etc/ssh/sshd_config 将PermitRootLogin注释打开,并将值改为yes 保存修改并退出 :wq 2.重启ssh服务 sudo service ssh restart 3.重新打…

UG\NX二次开发 设置视图中心 UF_VIEW_set_center

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a1794902437 订阅本专栏,非常感谢。 简介 UG\NX二次开发 设置视图中心 UF_VIEW_set_center。如果视图NULL_TAG,则使用工作视图。 效果 代码 #include &qu…

Android12 启动页适配

印象中,在2022年末接到了一个针对Android12启动页适配的需求,当时也使用了一些适配方案,也写了一个Demo,但是最终没有付诸适配行动;当然并不是适配失败,而是根据官方适配方案适配后太丑了… 1024纪念文章&a…

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

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

【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目

文章目录 前言一、雪崩问题及其解决方案1.1 什么是雪崩问题1.2 雪崩问题的原因1.3 解决雪崩问题的方法1.4 总结 二、初识 Sentinel 框架2.1 什么是 Sentinel2.2 Sentinel 和 Hystrix 的对比 三、Sentinel 的安装部署四、集成 Sentinel 到微服务 前言 微服务架构在现代软件开发…

【Kotlin精简】第6章 反射

1 反射简介 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。 1.1 Kotlin反射 我们对比Kotlin和Java的反射类图。 1.1.1 Kotlin反射常用的数据结…