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开发随手记之二——二进制文件的相关操作

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

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

/** * 照片转byte二进制 * @param imagepath 需要转byte的照片路径 * @return 已经转成的byte * @throws Exception */ pub...

android 内部文件读取

Android 文件管理方法 Android使用的是基于Linux的文件系统,对于文件的访问和管理是通过权限设置来限制的. 在Linux系统中,文件权限分别描述了创建者、同组用户和其他用户对文件的...

NDK编译Android上运行的C可执行程序

大部分讲到NDK编译的都是针对编译动态静态库的,有些特殊的需求需要编译成可执行文件,所以在此记录一下 本文基于win7 首先NDK的目录需要加到系统路径中去,这样ndk-build才能正常调用,n...

使用ndk-build编译android可执行文件

target.c #include int count = 0; void sevenWeapons(int number) { char* str = "Hello,11111111!...

Java读写二进制文件

  import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io....

在 Android 中调用二进制可执行程序(native executable )

前几天有需要在java代码中调用二进制程序,就在网上找了些资料,写点东西记录下。 Android 也是基于linux 的系统,当然也可以运行二进制的可执行文件。只不过Android 限制了直接的方式...

Jni中执行ndk-build,编译第三方静态库(.a)和动态库(.so)的Android.mk文件写法

Jni中执行ndk-build,编译第三方静态库(.a)和动态库(.so)的Android.mk文件写法 Android Studio编译JNI接口,当需要调用第三方静态库或者动态库时,正确...

Virtual Piano 自动播放乐谱

C++ midi virtual piano music synthesizer 自动播放音谱
  • dizuo
  • dizuo
  • 2010年11月27日 13:55
  • 4074

android多分辨率开发的解决方案(2)-----适配大部分手机

android多分辨率适配是一个老生常谈的问题了,但是随着市面上的手机越来越多样化,以前好多方法到现在已经不管用,或者说要做到很好的适配需要添加各种特例,这样大大增大我们研发的难度和时间。之前我总结了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 使用NDK编译二进制文件并运行
举报原因:
原因补充:

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