Android 使用NDK编译二进制文件并运行

原创 2015年11月19日 11:14:19

Android 使用NDK编译二进制文件并运行

本文介绍如何编译可以在Android平台上运行的二进制可执行文件。
首先我们,知道,Android是基于Linux的,而在Linux上,可以执行二进制文件,那么如何在Android上执行二进制文件呢?

使用NDK编译

如果你已经下载了NDK,并且将其添加进环境变量,可以这样编译二进制文件。

首先新建一个HelloWorld文件夹,在其内部建立一个子文件夹jni,
jni包含3个文件夹,hello.c,Android.mk,Application.mk
1. hello.c 代码如下

#include <stdio.h>
int main(void){
    printf("Hello World!\n");
    return 0;
}

代码很简单,就是输出一句话

  1. Android.mk文件
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c

include $(BUILD_EXECUTABLE)

好,我们来解释一下这几行代码:

LOCAL_PATH := $(call my-dir)
一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数my-dir, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

include $( CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等…),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。

LOCAL_MODULE := hello
LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。

LOCAL_SRC_FILES := hell.c

LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好

include $(BUILD_EXECUTABLE)

BUILD_EXECUTABLE是编译系统提供的变量,告诉编译器编译成二进制文件。

  1. Application.mk文件
APP_ABI := all

该指令的意思是,对所有的硬件结构(arm,x86等),都编译一个可执行文件。
然后我们在cmd,切换到HelloWorld目录下,执行ndk-build编译,
这里写图片描述
我们发现编译成功后,Hello World目录下多了一个libs目录,这个就是我们可执行二进制文件的目录啦,我们打开,发现里面有很多子目录,
这里写图片描述
这是因为,我们在Application.mk文件中,指定所有的架构都要编译,我们根据自己手机的架构(我的是armv7架构),将其目录下的hello文件,通过adb push命令复制到手机上,

adb push hello /data/local/tmp

注意,Android的有些目录是无法执行二进制文件的,所以一般放在/data/local/tmp目录中。

Android手机上执行二进制文件

上一步,我们已经把二进制文件hello复制到手机上,我们来测试,其是否能在手机上运行。
通过adb shell进入手机shell模式,
然后切换到/data/local/tmp目录,
执行ls命令,查看是否存在hello文件,若不存在,请确保上述步骤正确。
若存在,我们执行该文件
这里写图片描述
然而,却提示我们无法执行,怎么回事?
别急,我们用ls -l hello命令来查看hello的详细信息,
这里写图片描述
我们发现hello是没有可执行权限的(关于权限不懂,请自行百度Linux权限),我们通过chmod命令来修改其权限,chmod 751 hello,然后执行
这里写图片描述
我们发现,执行成功了!

版权声明:本文为博主原创文章,未经博主允许不得转载。

三种方法使android 手机执行 二进制程序

参考文档:http://gimite.net/en/index.php?Run%20native%20executable%20in%20Android%20App 假如我要执行的二进制文件名为...
  • aa421958691
  • aa421958691
  • 2015年08月06日 18:24
  • 246

Android开发随手记之二——二进制文件的相关操作

此文用于总结在Android开发中,各种二进制文件,如音乐,视频,图片等的各种操作。学识浅薄,不会一次性地把所有内容全部写出来,以后会陆陆续续地更新。 1、图片 1、将图片存入SQLite数据库 将图...
  • github_31871281
  • github_31871281
  • 2016年02月19日 14:23
  • 1629

Android 照片文件转化为而二进制流

/** * 照片转byte二进制 * @param imagepath 需要转byte的照片路径 * @return 已经转成的byte * @throws Exception */ pub...
  • qq_32521313
  • qq_32521313
  • 2017年04月01日 09:20
  • 4160

android studio ndk编译原生可执行文件

修改CMakeLists.txt文件 cmake_minimum_required(VERSION 3.4.1) set(CMAKE_VERBOSE_MAKEFILE on) set(EXEC...
  • znjcx
  • znjcx
  • 2017年02月23日 20:36
  • 757

安卓 编译c/c++生成elf二进制可执行文件 交叉编译

快一个小时,自己解决了. Linux不熟,大神勿喷,本文只是给那些和我差不多的人少走弯路. 夜神模拟器 我的i686的cpu,所以g++文件是i686开始的,你的可能会不一样. //正文开始 首先...
  • mistyrain0109
  • mistyrain0109
  • 2017年04月02日 16:25
  • 473

编译静态二进制文件

现在有一个文件"a.c",其中内容如下: #include int main() { printf("Hello World"); return 0; }使用"gcc a.c"命令,...
  • DSLZTX
  • DSLZTX
  • 2015年11月09日 08:03
  • 1017

Linux运行二进制文件时出现 can't execute :Permission denied

前一段开发一个Android项目,其中用到了使用一个二进制文件运行在Android平台上作为测试服务器,用来接收数据在控制台输出。 使用   ./[可执行程序名字]来运行程序,报can't exec...
  • y449756770
  • y449756770
  • 2015年08月12日 17:28
  • 1513

源代码文件到二进制可执行文件的过程

=== .c   === 预处理 -》.c (源文件) 编译 -》.s/asm (汇编程序) 汇编 -》.o/obj 目标程序(二进制文件) 链接 -》.exe可执行程序 (...
  • microlyc
  • microlyc
  • 2017年10月09日 11:21
  • 290

运行最终形成的可执行的二进制文件

运行最终形成的可执行的二进制文件(.exe文件),得到运行结果?   如果运行结果不正确,应检查程序或算法是否有问题?   命令行开发方式   在Unix世界有大量的程序...
  • wsnbjj
  • wsnbjj
  • 2014年08月26日 08:46
  • 1096

go 语言跨平台编译android版

系统:centos7   go版本1.6.3  golang环境安装见上文 1.首先进入go/src 源码所在目录,执行如下命令创建目标平台所需的包和工具文件。 $  cd /usr...
  • lipei1220
  • lipei1220
  • 2017年06月15日 19:59
  • 1001
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 使用NDK编译二进制文件并运行
举报原因:
原因补充:

(最多只允许输入30个字)