【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内容如下:

#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;
}

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

cd exec_demo
ndk-build

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

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目录下:

adb push ./helloworld data/local/tmp

授予文件可执行权限:

adb shell 
cd data/local/tmp
chmod +x ./helloworld

执行文件查看日志:

# 无参执行
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

参考资料

  • NDK Samples: Overview
  • NDK ndk-build Guides
  • ndk编译可执行文件教程

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

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

相关文章

【prompt四】Domain Prompt Learning for Efficiently Adapting CLIP to Unseen Domains

motivation 领域泛化(DG)是一个复杂的迁移学习问题,旨在学习未知领域的可泛化模型。最近的基础模型(FMs)对许多分布变化都具有鲁棒性,因此,应该从本质上提高DG的性能。在这项工作中,我们研究了采用视觉语言基础模型CLIP来解决图像分类中的DG问题的通用方法。虽然ERM使用标…

uniapp开发小程序使用x-www-form-urlencoded; charset=UTF-8 编码格式请求案例

使用x-www-form-urlencoded&#xff0c;header要放在前面&#xff0c;第一行位置。 uni.request({ header: { content-type: application/x-www-form-urlencoded; charsetUTF-8},url: ,method:POST, //请求方式POST\GETdata:that.loginData,success: funct…

音视频开发之旅——音频基础概念、交叉编译原理和实践(LAME的交叉编译)(Android)

本文主要讲解的是音频基础概念、交叉编译原理和实践&#xff08;LAME的交叉编译&#xff09;&#xff0c;是基于Android平台&#xff0c;示例代码如下所示&#xff1a; AndroidAudioDemo 音频基础概念 在进行音频开发的之前&#xff0c;了解声学的基础还是很有必要的。 声音…

NumPy数据处理详解的笔记3

NumPy数据处理详解的笔记3 第1章NumPy基础 NumPy是用于处理多维数组的数值运算库&#xff0c;不仅可用于 机器学习&#xff0c;还可以用于图像处理&#xff0c;语言处理等任务。 1.4 切片 python编程语言对数组切片功能有支持, NumPy 的ndarray 的切片功能是类似的&#xf…

K线实战分析系列之二十二:圆形顶部和圆形底部形态

K线实战分析系列之二十二&#xff1a;圆形顶部和圆形底部形态 一、圆形顶部形态二、圆形顶部和圆形底部形态的总结 一、圆形顶部形态 市场多空一方被逐渐击退&#xff0c;跳空的缺口是一方突然发力&#xff0c;体现出一方对市场掌握了控制权 二、圆形顶部和圆形底部形态的总结…

IDEA切换JDK版本超详细步骤

&#x1f600; IDEA切换JDK版本详细教程&#xff0c;全网步骤最详细&#xff0c;实测可用。 文章目录 第一步、选择SDKs切换SDK版本&#xff1a;第二步、选择Modules切换Sources和Dependencies版本&#xff1a;第三步、选择Project切换SDK和Language Level版本&#xff1a;第四…

MySQL中触发器的使用

触发器 模板 -- BEFORE|AFTER表是在数据库事件发生之前或之后执行 -- INSERT|UPDATE|DELETE表是发生什么数据库事件 -- FOR EACH ROW表示为每一行trigger_body数据都执行该触发器 CREATE TRIGGER trigger_name BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name FOR EACH ROW…

算法训练营day40(补),动态规划8

//139. 单词拆分 func wordBreak(s string, wordDict []string) bool { wordMap : make(map[string]bool) n : len(s) for _, word : range wordDict { wordMap[word] true } dp : make([]bool, n1) dp[0] true for i : 1; i < n; i { // 遍历背包 for j : 0; j < i; …

2024年冲刺年薪40w,java面试常问知识点

前言 刚刚过去的双十一&#xff0c;让“高性能”“高可用”“亿级”这3个词变成了技术热点词汇&#xff0c;也让很多人再次萌发成为「架构师」的想法。先问大家一个问题&#xff1a;你觉得把代码熟练、完成需求加上点勤奋&#xff0c;就能成为架构师么&#xff1f;如果你这么认…

LeetCode1039. Minimum Score Triangulation of Polygon——区间dp

文章目录 一、题目二、题解 一、题目 You have a convex n-sided polygon where each vertex has an integer value. You are given an integer array values where values[i] is the value of the ith vertex (i.e., clockwise order). You will triangulate the polygon in…

MySQL:索引的优化方法

索引是帮助存储引擎快速获取数据的一种数据结构&#xff0c;形象的说就是索引是数据的目录。 索引创建的时机&#xff1a; 索引并不是越多越好的&#xff0c;虽然他再查询时会提高效率&#xff0c;但是保存索引和维护索引也需要一定的空间和时间成本的。 不创建索引&#xff1a…

从一个word里面复制表格到另一个word时,表格变形的问题

复制过来保留源格式&#xff0c;检查段落、页边距里面的格式都和原始word一致后&#xff0c;仍然表格变形。 这时点页边距-自定义页边距-文档网格 看字符数是不是一致的

C/C++ 笔试(一)

以下程序的运行结果是&#xff08;&#xff09; int main(void) {printf("%s , %5.3s\n", "computer", "computer"); return 0; }A computer , puter B computer , com C computer , computer D computer , compu.ter B %m.ns 输出占m列&#…

BigDecimal比较两数大小

文章目录 关于BigDecimal 关于BigDecimal 在Java中&#xff0c;可以使用compareTo方法来比较两个BigDecimal类型的数据的大小。该方法会返回一个整数&#xff0c;表示两个数的大小关系。 如果返回值小于0&#xff0c;表示第一个数小于第二个数。 如果返回值等于0&#xff0c;表…

【Logback】Logback 中的 Appenders

目录 1、什么是 Appenders&#xff1f; 2、解说 AppenderBase.doAppend() 方法 3、logback-core 模块中的 Appenders &#xff08;1&#xff09;OutputStreamAppender &#xff08;2&#xff09;ConsoleAppender &#xff08;3&#xff09;FileAppender &#xff08;4&a…

乐观锁存在哪些问题?

乐观锁存在哪些问题&#xff1f; 文章目录 乐观锁存在哪些问题&#xff1f;ABA 问题循环时间长开销大只能保证一个共享变量的原子操作 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 ABA 问题是乐观锁最常见的问题。 ABA 问题 如果一个变量 V 初次读取的时候是 A…

SpringCloud微服务-DockerCompose(初识、安装、部署)

DockerCompose&#xff08;初识、安装、部署&#xff09; 文章目录 DockerCompose&#xff08;初识、安装、部署&#xff09;初识DockerCompose&#xff1f;DockerCompose安装DockerCompose部署微服务问题解决&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09…

final修饰符、多态、抽象类以及抽象类与接口的区别

final修饰符作用&#xff1a; 修饰变量&#xff1a;被final修饰的变量不能被重新赋值&#xff0c;即变为常量。对于基本数据类型的变量&#xff0c;其数值一旦在初始化后就不能更改&#xff1b;对于引用类型的变量&#xff0c;其引用不能更改&#xff0c;但是指向的对象内容可以…

小白跟做江科大51单片机之DS1302按键可调时钟

1.引入上一个程序的代码 2.引入Key和Timer0文件 3.获取按键值 定义全局变量unsigned char keynum main函数中 keynumKey(); 4.设置第一个按键的两种模式&#xff0c;以此来控制时钟的设定和显示 if(keynum1) { if(MODE0) { …

c++ primer学习笔记(二)

目录 第三章 一、命名空间的using声明 二、标准库的string类型 1、string对象的定义和初始化 2、string对象的读写 3、string对象的操作 4、string对象中字符的处理 三、标准库的vector类型 1、vector对象的定义和初始化 2、vector对象的操作 四、迭代器简介 1、简…