【NDK系列】使用ndk-build构建可在Android设备运行的ELF可执行文件

背景

通常在安卓开发过程中涉及到的NDK开发产物都是以JNI+so文件为主的library(库文件),包括谷歌官网给出的示例也是演示了如何开发一个JNI库。本文则是介绍如何利用NDK开发一个最简单的可以在Android设备运行的可执行程序。

开发步骤

创建以下目录结构的项目工程:

复制代码
exec_demo
		├── jni
		   ├── Android.mk
		   └── main.cpp

其中Android.mk中的内容如下:

复制代码
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := main.cpp
include $(BUILD_EXECUTABLE)

Android.mk相关代码可以从官网demo获取。

main.cpp内容如下:

cpp 复制代码
#include <jni.h>
#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("hello world from %d, %s\n", argc, argv[0]);
    return 0;
}

执行编译,生成可执行文件

bash 复制代码
cd exec_demo
ndk-build

编译完成可以在libs/arm64-v8a目录下找到helloworld可执行文件,查看该文件信息如下:

bash 复制代码
cd libs/arm64-v8a
file helloworld

输出结果如下:

复制代码
helloworld: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, BuildID[sha1]=9046a35e13dc3a13a1de6a0dc8007456de28aa66, stripped

测试效果

先推送可执行文件到/data/local/tmp目录下:

bash 复制代码
adb push ./helloworld data/local/tmp

授予文件可执行权限:

bash 复制代码
adb shell 
cd data/local/tmp
chmod +x ./helloworld

执行文件查看日志:

bash 复制代码
# 无参执行
127|mayfly:/data/local/tmp $ ./helloworld
hello world from 1, ./helloworld
# 输入多个参数
mayfly:/data/local/tmp $ ./helloworld 1 2 3 4
hello world from 5, ./helloworld

参考资料

相关推荐
石山岭2 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧4 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker9 小时前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋10 小时前
Android 现代架构不需要事件总线进阶篇
android
杉氧1 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏1 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧1 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄1 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭1 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景1 天前
Kotlin Flow操作符学习
android·kotlin