`
zhubin215130
  • 浏览: 139999 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]Android编译环境 - 编译Native C的helloworld模块

阅读更多

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)/development/hello/目录编写hello.c文件,hello.c的内容当然就是经典的HelloWorld程序:

#include <stdio.h>

int main()
{
    printf("Hello World!\n");

return 0;
}

 

3. $(YOUR_ANDROID)/development/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 := 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,通过”adb push”将它传送到模拟器上,再通过”adb shell”登录到模拟器终端,就可以执行了

分享到:
评论
1 楼 bani1314 2010-09-03  
如果是一个库的话写一个android.mk也是那么容易吗?比如说移植iconv库

相关推荐

    Android编译NativeC的helloworld模块

    Android编译Native C的helloworld模块

    一款java2c加固混淆工具 java转c 交叉编译.dll.so

    MYJ2C将编译的Java方法转换为C语言。编译生成的文件后,生成的二进制文件通过Java Native Interface 重新链接到原始程序。在此过程结束时,包含原始方法的.class文件中不会保留原始方法的信息。 Before public ...

    kotlin-libui,kotlin libui kotlin/native interop到libui:a.zip

    kotlin/native绑定到libui c library.libui是一个c轻量级多平台ui库,在linux(gtk3)、macos和windows上使用本机小部件。使用此绑定,您可以开发跨平台的、看起来像本机的gui程序,用kotlin编写,并编译为小型本机...

    ysy950803#ysy950803.github.io#2022-02-11-Rust为Android应用编译so库1

    前言我们开发应用同样也可以使用Rust来编写原本为C++的Native代码。网上搜罗一圈,入门的文档不多不少,这里稍微归纳整理一下吧,毕竟Hello World

    myj2c java混淆工具

    MYJ2C是一款Java混淆工具,将编译好的Class文件转换为C语言代码,然后交叉编译(您不用自己配置编译环境,MYJ2C自动完成)可以生成Windows,Linux,Mac系统X86,ARM平台的动态链接库文件后,通过Java Native ...

    cohttp-lwt-hello:使用 Mirage 的基于 LWT 的 cohttp 库实现最简单的 hello world

    cohttp-lwt-hello 使用 Mirage 的基于 LWT 的库实现最简单的 hello ... 这里的目的是提供一个比更短、更易读的 cohttp 介绍编译和使用: $ make$ ./hello.native 别处: $ curl " http://localhost:8081/ "helloworld

    Android上使用grpc的方法教程

    编译谷歌官方的helloworld工程 添加rotobuf-gradle-plugin插件 首先添加rotobuf-gradle-plugin插件,他是用来从proto文件自动生成java代码的: //Project的build.gradle中添加rotobuf-gradle-plugin插件 buildscript...

    Android 代码分析

    1 Android build system 4 1.1 Basic 4 1.2 Executable 6 1.3 Shared Library 9 2 Android Initialization Process 11 3 Android JAVA AIDL Analysis 15 4 Android JAVA Binder IPC ...31 编译Native C的helloworld 118

    CSharpAsmjs:C#Hello World示例到Asm.js

    CSharpAsmjs C#Hello World示例到Asm.js 我试图写一个Hello World! 可以转换为Asm.js的示例应用程序首先使用C#Native( )转换为C ++,然后使用Emscripten( )转换为JavaScript。障碍: EMscripten无法编译C#...

    jni试用资料

    编译HelloWorld类  1 public class HelloWorld {  2 public native void displayHelloWorld();  3  4 public native void printxx(String str);  5

    haskell-mobile:在移动设备上构建Haskell应用(AndroidiOS)

    提供的示例项目是Nativescript hello world模板的直接端口。 一个按钮和一些标签。 请注意,这不是很好的Haskell代码! 而且并不意味着这样。 它遵循原始格式的约定和布局,以便于更轻松地理解其移植方式。 在回购...

    c#学习笔记.txt

    在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种情况中,委托不仅存储对方法入口点的引用,还存储对调用其方法的对象的引用。与 C 函数指针...

    zerosharp:使用.NET本机提前编译技术进行C#进行系统编程的潜力演示

    C#用于系统编程这些示例展示了如何使用.NET Native AOT技术( ,以前也称为CoreRT)将C#编译为本地代码。 no-runtime是一个毫无意义的示例,它演示了如何在无需运行时即可直接运行的C#中编写代码。 C#具有值类型...

    clobits:Clojure:red_heart:C —在Clojure中使用C,在JVM +本机上运行

    特征一个可以全部处理的资源-编写一次代码,即可在jvm和本机二进制文件上运行( ns clobits.examples.ncurses.hello-world ( :require [clobits.native-interop :refer [*native-image*]] [clobits.c :as c]) ( :gen-...

    ScratchJavaJNI:一个演示Java JNI API示例,可用作Java Native Interface项目的起点

    要在Linux上编译并运行(您需要正确安装gcc和JDK),请使用提供的简单Makefile执行以下操作: makemake run输出将是这样的:Hello World (https://gianlu.dev/) 14!The response from C is: I'm the C boss!要从C...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

    Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制 Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流...

Global site tag (gtag.js) - Google Analytics