一个小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系统库的问题,这里不做详细说明,在不清楚的情况下,最好的解决办法可能就是根据错误信息,去添加各个库文件.
这篇文章不涉及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系统库的问题,这里不做详细说明,在不清楚的情况下,最好的解决办法可能就是根据错误信息,去添加各个库文件.