Android 使用NDK编译二进制文件并运行
本文介绍如何编译能够在Android平台上运行的二进制可执行文件。
首先咱们,知道,Android是基于Linux的,而在Linux上,能够执行二进制文件,那么如何在Android上执行二进制文件呢?shell
使用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;
}
代码很简单,就是输出一句话测试
Android.mk文件
LOCAL_PATH := $(call my-dir)ui
include $(CLEAR_VARS).net
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.cblog
include $(BUILD_EXECUTABLE)
好,咱们来解释一下这几行代码:开发
LOCAL_PATH := $(call my-dir)
一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数my-dir, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。cmd
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是编译系统提供的变量,告诉编译器编译成二进制文件。
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,而后执行 咱们发现,执行成功了! ———————————————— 转载 https://blog.csdn.net/u014088294/article/details/49924967