当前位置: 首页 > news >正文

【软件教程】如何用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.lryc.cn/news/204711.html

相关文章:

  • 进阶JAVA篇- Map 系列集合的遍历方法与常用API
  • Auth.js:多合一身份验证解决方案 | 开源日报 No.60
  • SpringBoot整合Activiti7——任务监听器(七)
  • 电解电容寿命与哪些因素有关?
  • Opencv-图像插值与LUT查找表
  • 我为什么写博客?写博客给我带来了什么?
  • jdk11的HttpClient
  • Redis的优势
  • C++ string 类的其他操作
  • structs2 重构成SpringBoot架构
  • 【MATLAB源码-第56期】基于WOA白鲸优化算法和PSO粒子群优化算法的三维路径规划对比。
  • 【WinForm详细教程一】WinForm中的窗体、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox
  • 【SwiftUI模块】0060、SwiftUI基于Firebase搭建一个类似InstagramApp 3/7部分-搭建TabBar
  • PureFlash云原生存储部署方法
  • SqueezeNet 一维,二维网络复现 pytorch 小白易懂版
  • Java 数据结构
  • python sqlalchemy(ORM)- 02 表关系
  • Http长连接同一个socket多个请求和响应如何保证一一对应?
  • Standford Compiler Course Assignment 2
  • 基于Java的校园论坛管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 谈谈你对Spring的理解
  • 系统架构师考试易混淆知识点总结
  • 反射的作用( 越过泛型检查 和 可以使用反射保存所有对象的具体信息 )
  • 前端开发实践:vue中用qrcode库将超链接生成二维码图片
  • 数据库连接池有什么用?它有哪些关键参数?
  • Android Settings解析
  • Spring+spring mvc+mybatis整合的框架
  • 02-2、PyCharm中文乱码的三处解决方法
  • Axi接口的DDR3:参数,时序,握手机制
  • 浏览器标签上添加icon图标;html引用ico文件