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

来源:互联网 发布:结构化编程 编辑:程序博客网 时间:2024/04/20 11:23

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    := helloLOCAL_SRC_FILES := hello.cinclude $(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,然后执行
这里写图片描述
我们发现,执行成功了!

0 0