【软件教程】如何用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. 创建文件夹和文件,对应的文件树如下,最外层文件夹名可自定。
  1. /my_android_hook/jni/Android.mk代码如下,如果需要构建动态链接库,则使用"include (BUILD_SHARED_LIBRARY)",如果需要构建可执行程序,则使用"include (BUILD_EXECUTABLE)"。
python 复制代码
# 获取当前目录路径并赋给 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)
  1. /my_android_hook/jni/Application.mk代码如下。
python 复制代码
# 指定编译生成的模块文件支持的 CPU 架构,这里选择 armeabi-v7a。
APP_ABI := armeabi-v7a
# 指定编译生成的模块文件运行支持的 Android 版本,这里选择 android-21。
APP_PLATFORM := android-21
# 指定使用的 C++ 标准库,这里选择 c++_static。
APP_STL := c++_static
  1. /my_android_hook/jni/hook.c代码可以自己写,也可以是.cpp文件。

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

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

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

  1. 用ADB连接真机或者模拟器。(真机用开发者选型->usb调试,模拟器将端口号改为模拟器adb端口)
  1. 将ELF程序push到android设备的/data/local/tmp路径下。
  1. 使用终端命令行adb shell进入android shell,并使用su命令获取root权限。
  1. cd到/data/local/tmp路径,使用命令chmod +x {文件名}将ELF程序修改为可执行。
  1. 使用命令./{文件名}运行ELF程序。(如果输出太多,也可以使用./{文件名} >1.txt将输出保存到1.txt文件里,然后使用cat 1.txt或者head -n 10 1.txt查看输出)
  1. 如果运行结果与预想一致,说明编译出的ELF程序可以在目标平台运行,如果出现问题,可能是Application.mk文件指定的APP_PLATFORM版本或者APP_ABI与目标平台不一致。
相关推荐
学传打活3 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续3)
微信公众平台·1024程序员节·汉字·昆仑正义文化
学传打活8 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng16816 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心18 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552724 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552725 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝1 个月前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055271 个月前
Java图像处理实战指南
人工智能·1024程序员节
u0103055271 个月前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055271 个月前
Java实用类应用精讲
人工智能·1024程序员节