zoukankan      html  css  js  c++  java
  • Android 使用NDK编译二进制文件并运行

    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! ");
    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

  • 相关阅读:
    RESTful API设计指南
    Ubuntu16.04 安装openssl
    shell while循环
    linux awk
    vim与shell切换
    shell for循环
    css 固定宽度,自动换行
    php-fpm 与 cgi
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/usr/local/mysql/tmp/mysql.sock'
    linux ps 命令参数详解
  • 原文地址:https://www.cnblogs.com/adong7639/p/11377001.html
Copyright © 2011-2022 走看看