zoukankan      html  css  js  c++  java
  • 【转】Android项目中编译 C的模块

    原文网址:http://blog.csdn.net/Harrison_zhu/article/details/4057738

    Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才有Makefile文件,而其他的每个component都使用统一标准的Android.mk. Android.mk文件本身是比较简单的,不过它并不是我们熟悉的Makefile,而是经过了Android自身编译系统的很多处理,因此要真正理清楚其中的联系还比较复杂,不过这种方式的好处在于,编写一个新的Android.mk来给Android增加一个新的Component会比较简单。 编译Java程序可以直接采用Eclipse的集成环境来完成,这里就不重复了。我们主要针对C/C++来说明,下面通过一个小例子来说明,如何在Android 中增加一个C程序的Hello World:
    1. 在$(YOUR_ANDROID)/ development 目录下创建hello目录,其中$(YOUR_ANDROID)指Android源代码所在的目录。 
    - # mkdir $(YOUR_ANDROID)/development/hello
    2. 在$(YOUR_ANDROID)/external/hello/目录编写hello.c文件,hello.c的内容当然就是经典的HelloWorld程序:
    #include <stdio.h>

    int main(int argc, char **argv)
    {
        printf("Hello World!/n");

    return 0;
    }
     

     
    3. 在$(YOUR_ANDROID)/external/hello/目录编写Android.mk文件。这是Android Makefile的标准命名,不要更改。Android.mk文件的格式和内容可以参考其他已有的Android.mk文件的写法,针对helloworld程序的Android.mk文件内容如下:
    LOCAL_PATH:= $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_SRC_FILES:= /

        hello.c

     LOCAL_MODULE_TAGS := optional

    LOCAL_MODULE := helloworld

    include $(BUILD_EXECUTABLE)
     

    注意上面LOCAL_SRC_FILES用来指定源文件;,LOCAL_MODULE指定要编译的模块的名字,下一步骤编译时就要用到;include $(BUILD_EXECUTABLE)表示要编译成一个可执行文件,如果想编译成动态库则可用BUILD_SHARED_LIBRARY,这些可以在$(YOUR_ANDROID)/build/core/config.mk查到。
    4. 回到Android源代码顶层目录进行编译:
    # cd $(YOUR_ANDROID) && make helloworld
     

    注意make helloworld中的目标名helloworld就是上面Android.mk文件中由LOCAL_MODULE指定的模块名。编译结果如下:
    target thumb C: helloworld <= development/hello/hello.c

    target Executable: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld)

    target Non-prelinked: helloworld (out/target/product/generic/symbols/system/bin/helloworld)

    target Strip: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld)

    Install: out/target/product/generic/system/bin/helloworld
     

     
    5.如上面的编译结果所示,编译后的可执行文件存放在out/target/product/generic/system/bin/helloworld目录

    启动Android模拟器,用如下命令将文件push到Android模拟器上:

        注意:  要把SDK目录里的tools目录放到PATH环境变量中.

    adb shell mkdir /dev/sample
    adb push hello /dev/sample/hello

    adb shell chmod 777 /dev/sample/hello

    先创建 /dev/sample目录,再将编译好的hello上传上去,最后将hello改成可执行的。

    再进入命令行模式,进入Android的shell环境:

    adb shell

    #cd /dev/sample

    #./hello

  • 相关阅读:
    mysqlp批量替换的sql语句
    Paypal 支付功能的 C# .NET / JS 实现
    Layui table 组件的使用:初始化加载数据、数据刷新表格、传参数
    WinForm DataGridView 绑定泛型List(List<T>)/ArrayList不显示的原因和解决
    entity framework codefirst 用户代码未处理DataException,InnerException基础提供程序在open上失败,数据库生成失败
    《设计模式》一书中的23种设计模式
    C++程序实例唯一方案,窗口只打开一次,程序只打开一次
    重构——与设计模式的恋情
    重构——一个小例子
    C#通过调用WinApi打印PDF文档类,服务器PDF打印、IIS PDF打印
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4308606.html
Copyright © 2011-2022 走看看