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

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

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是编译系统提供的变量,告诉编译器编译成二进制文件。

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

Android 使用NDK编译二进制文件并运行的更多相关文章

  1. android开发 NDK 编译和使用静态库、动态库 (转)

    在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...

  2. Android 使用NDK编译sipdroid Library

    sipdroid是一款开源的运行于Android平台上的voip,目前支持音频和视频通话: 项目拖管地址:http://code.google.com/p/sipdroid/ 下载源代码,导入ecli ...

  3. Android studio NDK 编译 "$USE_DEPRECATED_NDK=true" 异常问题解决

    我的项目是https://github.com/leixiaohua1020/simplest_ffmpeg_mobile/tree/master/simplest_ffmpeg_android_st ...

  4. android用NDK编译出so最简单的方法

    其实只要是有个jni的文件夹,再放个Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hell ...

  5. [原]如何用Android NDK编译FFmpeg

    我们知道在Ubuntu下直接编译FFmpeg是很简单的,主要是先执行./configure,接着执行make命令来编译,完了紧接着执行make install执行安装.那么如何使用Android的ND ...

  6. 【转】NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

    原文网址:http://blog.csdn.net/hxdanya/article/details/39371759 由于使用了NDK编译的可执行文件在应用中调用,在4.4及之前的版本上一直没出问题. ...

  7. JNI 在Android Studio利用NDK编译运行一个简单的c库

    NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些.如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ...

  8. NDK编译可执行文件在Android 中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

    由于使用了NDK编译的可执行文件在应用中调用,在Android 7.0上的运行情况发现,当运行该可执行文件时,报如下错误: error: only position independent execu ...

  9. Android Studio 中关于NDK编译及jni header生成的问题

    之前由于工作原因使用grails这个基于groovy的框架做项目,对groovy感觉很好. 基于groovy的gradle构建系统对我而言自然也是好的没得说. Android Studio 正式版出来 ...

随机推荐

  1. Odoo模型的内置方法(可按需重写)

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826222.html ==========模型层面========== 一:_table_exist 检查 ...

  2. Flask基础之返回值与form表单提交

    目录 1.Python 现阶段三大主流Web框架 Django Tornado Flask 对比 2.Flask的安装 3.Flask的第一个简单应用 4.Flask中的render_template ...

  3. 202. 快乐数.Set去重作用实际作用

    编写一个算法来判断一个数是不是“快乐数”. 一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1.如 ...

  4. 微信之通过AppID和AppSecret获取access_token

    最近在搞微信公众平台这方面的东西,,但实际使用的时候发现和access_token有关的接口都无法正常调用,于是debug了下,发现获取到了AppID和AppSecret,在最后请求access_to ...

  5. python爬虫中遇到的问题以及解决方法

    (1)运行后报错:“TypeError: cannot use a string pattern on a bytes-like” 原因:content用decode(‘utf-8’)进行解码,由by ...

  6. CSS IE Hack

    条件注释判断浏览器!: [if !IE],The NOT operator. This is placed immediately in front of the feature, operator, ...

  7. scala 型变

    型变是复杂类型的子类型关系与其组件类型的子类型关系的相关性. Scala支持 泛型类 的类型参数的型变注释,允许它们是协变的,逆变的,或在没有使用注释的情况下是不变的. 在类型系统中使用型变允许我们在 ...

  8. Error handling in Swift does not involve stack unwinding. What does it mean?

    Stack unwinding is just the process of navigating up the stack looking for the handler. Wikipedia su ...

  9. docker 清理无用的卷

    docker  system prune 对于卷的清理不够彻底 题外话:docker volume ls查看当前卷列表 使用如下命令可以清理不用的卷 docker volume prune -f 强制 ...

  10. 什么是cdn?

    CDN加速意思就是在用户和我们的服务器之间加一个缓存机制, 通过这个缓存机制动态获取IP地址根据地理位置,让用户到最近的服务器访问. 那么CDN是个啥? 全称Content Delivery Netw ...