`
zhubin215130
  • 浏览: 142325 次
  • 性别: 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模块 #### 知识点概述 本篇文章将详细介绍如何在Android环境中构建一个简单的C语言程序——helloworld模块。该模块不仅有助于理解Android的编译系统,而且对于想要深入了解...

    android jni demo--helloworld

    总结来说,这个"android jni demo--helloworld"是Android开发者学习JNI入门的典型示例,通过它,我们可以了解如何在Java和C/C++之间建立桥梁,以及如何在Android项目中有效地利用JNI功能。对于深入的Android开发,...

    react-native-helloworld:将React Hello World应用程序转换为React Native应用程序

    - `react-native-helloworld-master`这个文件名可能表示的是项目源代码的主分支。通常,React Native项目的根目录下会有`index.js`作为入口文件,`App.js`包含应用的主要组件,`package.json`记录项目依赖和配置,...

    androidNDK helloworld

    通过这个简单的"androidNDK helloworld"例子,你不仅学习了如何在Android项目中设置NDK,还了解了JNI(Java Native Interface)的基本用法,包括创建原生库、编译C/C++代码、在Java中调用原生函数等关键步骤。...

    编译好的Android JNI HelloWorld

    本压缩包"编译好的Android JNI HelloWorld"提供了一个基础示例,帮助开发者验证其Android NDK开发环境是否已正确搭建。 JNI在Android开发中的作用主要体现在以下几个方面: 1. 性能优化:对于计算密集型任务,如...

    JNI-HelloWorld

    本示例“JNI-HelloWorld”就是关于如何使用JNI将Java与C语言结合,实现一个简单的“Hello, World!”程序。 首先,我们需要理解JNI的基本概念。JNI定义了一套接口和数据类型,使得Java代码能够声明本地方法(即非...

    Android编译环境

    在上述例子中,通过`make helloworld`命令,编译器根据Android.mk文件的指示,编译`hello.c`源文件,并生成名为`helloworld`的可执行文件。这个过程包括预处理、编译、链接和优化等步骤。 3. **编译选项**: `...

    JNI入门之HelloWorld(一)

    这里定义了一个名为`HelloWorld`的类,包含一个静态初始化块用于加载本地库,一个主方法用于启动程序,以及一个声明为native的方法`print`,该方法将在C/C++中实现。 ##### 2. 编译Java源码 使用`javac`命令编译`...

    Java JNI HelloWorld.rar

    编译`HelloWorld.c`成动态链接库`hello.dll`(在Windows上),在Linux或macOS上可能是`libhello.so`。这通常通过`gcc`或`g++`完成,并链接到JNI库: ```bash gcc -shared -o hello.dll HelloWorld.c -I/usr/lib/jvm...

    jni-helloWorld

    在这个JNI的"HelloWorld"示例中,我们可能首先会有一个Java类,它声明了一个native方法,这个方法的实现不在Java代码中,而是通过JNI接口在C++或C这样的本地语言中完成。Java类可能会包含一个`System.loadLibrary(...

    hello-world-react-native

    8. **运行与调试**:在完成代码编写后,可以使用`react-native run-android`或`react-native run-ios`命令来启动应用。React Native还支持实时重载(Hot Reloading)和快速刷新(Fast Refresh),使得开发过程更为...

    Android-NDK环境配置以及开发规范.docx

    而为了提高应用性能或复用现有 C/C++ 代码,Android NDK (Native Development Kit) 成为开发者的一个重要工具。本文将详细介绍如何在 Eclipse 环境下配置 Android NDK,并遵循一定的开发规范来构建基于 C/C++ 的原生...

    Anroid-JNI-HelloWorld

    "Anroid-JNI-HelloWorld"项目就是一个典型的入门示例,帮助开发者理解如何在Android应用中使用JNI技术。这个项目的核心目标是展示如何在Java和本地代码之间建立桥梁,从而实现混合编程。 首先,我们需要了解JNI的...

    android jni helloworld

    Android JNI(Java Native Interface)是Android系统中用于Java与本地代码(C/C++)交互的框架。JNI在Android开发中的应用广泛,例如优化性能、利用现有的C/C++库、访问硬件设备等。在这个"android jni helloworld...

    零基础Windows操作系统Android开发环境搭建与.so文件的生成

    在Android项目中,可以通过NDK (Native Development Kit)来编译生成.so文件。 - 首先需要下载并配置NDK,将其添加到系统环境变量中。 - 使用NDK提供的工具链编译本地代码,如`ndk-build`,生成对应的armeabi、...

    NDK_Helloworld_DEMO

    在Android应用开发中,NDK(Native Development Kit)是一个重要的工具集,它允许开发者使用C、C++等原生代码来编写部分应用模块,以提高性能、优化计算密集型任务或者利用硬件加速功能。"NDK_Helloworld_DEMO"就是...

    javacpp-presets-helloworld.zip

    JavaCPP是一个强大的库,它为Java开发者提供了直接访问C和C++库的能力,无需编写复杂的JNI(Java Native Interface)代码。这个"javacpp-presets-helloworld.zip"压缩包是专门为初学者准备的一个示例,旨在帮助他们...

    Android.JNI - NDKHelloWorld

    在Android开发中,JNI(Java Native Interface)是一种技术,它允许Java代码和其他编程语言(如C、C++)进行交互。JNI在许多场景下都非常重要,比如提高性能、利用硬件加速、或者集成第三方库。本教程将深入探讨如何...

    Android_C编译

    ### Android C编译详解 #### 一、Android.mk文件语法规范及使用模板 **1.1 Android.mk文件介绍** 在Android开发中,特别是在利用NDK(Native Development Kit)进行原生开发时,`Android.mk`文件起着核心作用。它...

Global site tag (gtag.js) - Google Analytics