Pages

Tuesday, 8 May 2012

Android中写c/c++测试程序

一个小demo吧,权当给刚开始搞android开发的人引引路子吧~(大牛莫笑,呵呵)

这篇文章不涉及Android上的java开发,不涉及jni的内容,只是单纯的为在android上写一个c/c++的可执行程序做个参考,对于Android上的java和jni等内容,会在以后的文章中陆续加入。
Android中的makefile:

Android编译环境本身比较复杂,且不像普通的编译环境:它只有顶层目录下才有Makefile文件,而其他的每个component都使用统一标准的 Android.mk.
Android.mk文件本身是比较简单的,不过它并不是我们熟悉的Makefile,而是经过了Android自身编译系统的很多处理,编写一个新的Android.mk来给Android增加一个新的Component会比较简单。

学习android必须对.mk的文件格式规范学习一下,关于这个的学习可以参考我的上一篇博客:android-mk文件语法规范和应用模板;

第一个“hello world”

    在你的$(android源码路径)/development目录下新建一个文件夹testhelloworld
    注:这里放在development目录下不是必须的,只是习惯问题~
    在你新建的文件夹下面新建两个文件,helloworld.c和Android.mk,文件内容分别为:
         helloworld.c (哈哈,非常简单吧,就不解释了)
        [codesyntax lang="cpp"]

        #include <stdio.h>
        void main()
        {
        printf("hello world\n");
        }

        [/codesyntax]
        Android.mk(各行的意思,还是去看上一篇文章学习一下吧,呵呵)
        [codesyntax lang="php"]

        LOCAL_PATH:= $(call my-dir)
        include $(CLEAR_VARS)
        LOCAL_SRC_FILES:= helloworld.c
        LOCAL_MODULE_TAGS := optional
        LOCAL_MODULE := helloworld
        include $(BUILD_EXECUTABLE)

        [/codesyntax]
        在Android源码根目录下执行下面命令:
        . build/envsetup.sh
        choosecombo
        这两条命令用来配置android的环境变量;
        最后执行mmm frameworks/testhelloworld,显示如下:
        mengcong@mengcong-desktop:~/android/gingerbread-mirror$ mmm development/testhelloworld/
        ============================================
        PLATFORM_VERSION_CODENAME=REL
        PLATFORM_VERSION=2.3.4
        TARGET_PRODUCT=generic
        TARGET_BUILD_VARIANT=eng
        TARGET_SIMULATOR=false
        TARGET_BUILD_TYPE=release
        TARGET_BUILD_APPS=
        TARGET_ARCH=arm
        HOST_ARCH=x86
        HOST_OS=linux
        HOST_BUILD_TYPE=release
        BUILD_ID=GINGERBREAD
        ============================================
        make: Entering directory `/home/mengcong/android/gingerbread-mirror’
        target thumb C: helloworld <= development/testhelloworld/helloworld.c
        development/testhelloworld/helloworld.c:4: warning: return type of ‘main’ is not ‘int’
        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
        make: Leaving directory `/home/mengcong/android/gingerbread-mirror’
        运行生成的helloworld可执行文件
        在out/target/product/generic/system/bin/目录下生成了,我们期待的helloworld 可执行文件,呵呵!但是这个可执行文件不能直接在模拟器中运行,需要在shell中运行
            执行命令make snod
            (好像是更新img文件用的,目的是将刚刚生成的helloworld可执行程序,更新到img文件中;)
            执行emulator&,运行模拟器
            在终端中运行,adb shell
            进入shell之后,cd到helloworld可执行程序在的文件夹cd /system/bin,然后执行./helloworld
            就可以看到我们刚才写的小程序helloworld已经运行了
            这个时候就代表我们用c/c++写的demo就可以运行了;
    最后说点这里是非常简单的一个小程序,如果设计到一些复杂的包括内存拷贝,字符串拷贝等高级函数的时候,涉及到通过mk文件来加载不同android系统库的问题,这里不做详细说明,在不清楚的情况下,最好的解决办法可能就是根据错误信息,去添加各个库文件.