??xml version="1.0" encoding="utf-8" standalone="yes"?>久久天堂AV综合合色蜜桃网,狠狠色婷婷久久综合频道日韩 ,99久久中文字幕http://www.shnenglu.com/tdweng/category/16224.htmlzh-cnTue, 02 Aug 2011 02:25:17 GMTTue, 02 Aug 2011 02:25:17 GMT60Android.mk文g语法规范及用模?/title><link>http://www.shnenglu.com/tdweng/articles/147176.html</link><dc:creator>心羽</dc:creator><author>心羽</author><pubDate>Thu, 26 May 2011 03:47:00 GMT</pubDate><guid>http://www.shnenglu.com/tdweng/articles/147176.html</guid><wfw:comment>http://www.shnenglu.com/tdweng/comments/147176.html</wfw:comment><comments>http://www.shnenglu.com/tdweng/articles/147176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/tdweng/comments/commentRss/147176.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/tdweng/services/trackbacks/147176.html</trackback:ping><description><![CDATA[<p><strong><span style="font-size: 12pt;">Android.mk</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">文g语法规范</span></strong></p> <p><span style="font-family: 宋体;">Ҏ</span>eoeandroid<span style="font-family: 宋体;">上的的连载,q行一些更新、修改和加亮?/span></p> <p><span style="font-family: 宋体;">今天译</span>ANDROID-MK.TXT<span style="font-family: 宋体;">文gQ英文原文g?/span>/development/Ndk/Docs/android-mk.txt<span style="font-family: 宋体;">Q?/span></p> <p>Android.mk<span style="font-family: 宋体;">文g语法规范</span></p> <p> </p> <p>Introduction:</p> <p>Android.mk<span style="font-family: 宋体;">~译文g是用来向</span>Android NDK<span style="font-family: 宋体;">描述你的</span>C,C++<span style="font-family: 宋体;">源代码文件的Q?/span> <span style="font-family: 宋体;">q篇文档描述了它的语法。在阅读下面的内容之前,假定你已l阅M</span>docs/OVERVIEW.TXT<span style="font-family: 宋体;">文gQ了解了它们的脚色和用途?/span></p> <p> </p> <p><span style="font-family: 宋体;">概述</span>:</p> <p><span style="font-family: 宋体;">一?/span>Android.mk file<span style="font-family: 宋体;">用来向编译系l描qC的源代码。具体来_</span>-<span style="font-family: 宋体;">该文件是</span>GNU Makefile<span style="font-family: 宋体;">的一部分,会被~译pȝ解析一ơ或更多ơ的</span>build<span style="font-family: 宋体;">pȝ。因此,您应量减少您声明的变量Q不要认为某些变量在解析q程中不会被定义?/span>-<span style="font-family: 宋体;">q个文g的语法允许把你的源代码组l成模块Q一个模块属下列cd之一Q?/span></p> <p><span style="color: blue; font-family: 宋体;">静态库</span></p> <p><span style="color: blue; font-family: 宋体;">׃n?/span></p> <p><span style="font-family: 宋体;">只有׃n库将被安?/span>/<span style="font-family: 宋体;">复制到您的应用Y件包。虽焉态库能被用于生成׃n库?/span></p> <p><span style="font-family: 宋体;">你可以在每一?/span>Android.mk file<span style="font-family: 宋体;">中定义一个或多个模块Q你也可以在几个模块中用同一个源代码文g?/span></p> <p>/*****************************************************************************/</p> <p>-<span style="font-family: 宋体;">~译pȝZ处理许多l节问题。例如,你不需要在你的</span>Android.mk<span style="font-family: 宋体;">中列出头文g和依赖文件?/span>NDK<span style="font-family: 宋体;">~译pȝ会Z自动处理q些问题。这也意味着Q在升</span>NDK<span style="font-family: 宋体;">后,你应该得到新?/span>toolchain/platform<span style="font-family: 宋体;">支持Q而且不需要改变你?/span>Android.mk<span style="font-family: 宋体;">文g?/span></p> <p><span style="font-family: 宋体;">注意Q这个语法同公开发布?/span>Android<span style="font-family: 宋体;">q_的开源代码很接近Q然而编译系l实C们的方式却是不同的,q是故意q样设计的,可以让程序开发h员重用外部库的源代码更容易?/span></p> <p> </p> <p><span style="font-family: 宋体;">单的例子</span>:</p> <p>---------------</p> <p><span style="font-family: 宋体;">在描q语法细节之前,׃来看一个简单的</span>"hello world"<span style="font-family: 宋体;">的例子,比如Q下面的文gQ?/span></p> <p>sources/helloworld/helloworld.c</p> <p>sources/helloworld/Android.mk</p> <p>'helloworld.c'<span style="font-family: 宋体;">是一?/span>JNI<span style="font-family: 宋体;">׃n库,实现q回</span>"hello world"<span style="font-family: 宋体;">字符串的原生Ҏ?/span></p> <p><span style="font-family: 宋体;">相应?/span>Android.mk<span style="font-family: 宋体;">文g会象下面q样Q?/span></p> <p>---------- cut here ------------------</p> <p>LOCAL_PATH := $(call my-dir)</p> <p>include $(CLEAR_VARS)</p> <p>LOCAL_MODULE:= helloworld</p> <p>LOCAL_SRC_FILES := helloworld.c</p> <p>include $(BUILD_SHARED_LIBRARY)</p> <p>---------- cut here ------------------</p> <p><span style="font-family: 宋体;">好,我们来解释一下这几行代码Q?/span></p> <p><strong>LOCAL_PATH</strong> := $(call my-dir)</p> <p><span style="font-family: 宋体;">一?/span>Android.mk file<span style="font-family: 宋体;">首先必须定义?/span>LOCAL_PATH<span style="font-family: 宋体;">变量。它用于在开发树中查找源文g?span style="color: blue;">在这个例子中Q宏函数’</span></span><span style="color: blue;">my-dir</span><span style="color: blue; font-family: 宋体;">’</span><span style="color: blue;">, </span><span style="color: blue; font-family: 宋体;">q译系l提供,用于q回当前路径Q即包含</span><span style="color: blue;">Android.mk file</span><span style="color: blue; font-family: 宋体;">文g的目录)?/span></p> <p><strong>include $( CLEAR_VARS)</strong></p> <p>CLEAR_VARS<span style="font-family: 宋体;">q译系l提供,指定?/span>GNU MAKEFILE<span style="font-family: 宋体;">Z清除许多</span>LOCAL_XXX<span style="font-family: 宋体;">变量Q例?/span> LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, <span style="font-family: 宋体;">{等</span>...),</p> <p><span style="font-family: 宋体;">?/span>LOCAL_PATH <span style="font-family: 宋体;">。这是必要的Q因为所有的~译控制文g都在同一?/span>GNU MAKE<span style="font-family: 宋体;">执行环境中,所有的变量都是全局的?/span></p> <p>LOCAL_MODULE := helloworld</p> <p><strong>LOCAL_MODULE</strong><span style="font-family: 宋体;">变量必须定义Q以标识你在</span>Android.mk<span style="font-family: 宋体;">文g中描q的每个模块。名U必L唯一的,而且不包含Q何空根{注意编译系l会自动产生合适的前缀和后~Q换句话_一个被命名?/span>'foo'<span style="font-family: 宋体;">的共享库模块Q将会生?/span>'libfoo.so'<span style="font-family: 宋体;">文g?/span></p> <p><span style="font-family: 宋体;">重要注意事项</span></p> <p><span style="font-family: 宋体;">如果你把库命名ؓ‘</span>libhelloworld<span style="font-family: 宋体;">’Q编译系l将不会dM?/span>lib<span style="font-family: 宋体;">前缀Q也会生?/span>libhelloworld.so<span style="font-family: 宋体;">Q这是ؓ了支持来源于</span>Android<span style="font-family: 宋体;">q_的源代码?/span>Android.mk<span style="font-family: 宋体;">文gQ如果你实需要这么做的话?/span></p> <p>LOCAL_SRC_FILES := helloworld.c</p> <p><strong>LOCAL_SRC_FILES</strong><span style="font-family: 宋体;">变量必须包含要~译打包q模块中?/span>C<span style="font-family: 宋体;">?/span>C++<span style="font-family: 宋体;">源代码文件。注意,你不用在q里列出头文件和包含文gQ因为编译系l将会自动ؓ你找Z赖型的文Ӟ仅仅列出直接传递给~译器的源代码文件就好。【注意,默认?/span>C++<span style="font-family: 宋体;">源码文g的扩展名?#8217;</span>.cpp<span style="font-family: 宋体;">’</span>. <span style="font-family: 宋体;">指定一个不同的扩展名也是可能的Q只要定?/span>LOCAL_DEFAULT_CPP_EXTENSION<span style="font-family: 宋体;">变量Q不要忘记开始的圆点(也就是定义ؓ‘</span>.cxx<span style="font-family: 宋体;">’</span>,<span style="font-family: 宋体;">而不?#8216;</span>cxx<span style="font-family: 宋体;">’Q(当然q一步我们一般不会去改它Q?/span></p> <p>include $(BUILD_SHARED_LIBRARY)</p> <p><strong>BUILD_SHARED_LIBRARY</strong><span style="font-family: 宋体;">是编译系l提供的变量Q指向一?/span>GNU Makefile<span style="font-family: 宋体;">脚本Q应该就是在</span>build/core<span style="font-family: 宋体;">目录下的</span>shared_library.mk<span style="font-family: 宋体;">Q,负责攉自从上次调用</span>'include $(CLEAR_VARS)'<span style="font-family: 宋体;">以来Q定义在</span>LOCAL_XXX<span style="font-family: 宋体;">变量中的所有信息,q且军_~译什么,如何正确地去做。ƈҎ其规则生成静态库。同理对于静态库?/span></p> <p> </p> <p> </p> <p> </p> <p>/****************************************************************************/</p> <p><span style="font-family: 宋体;">?/span>sources/samples<span style="font-family: 宋体;">目录下有更复杂一点的例子Q写有注释的</span>Android.mk<span style="font-family: 宋体;">文gQ你可以看看?/span></p> <p><span style="font-family: 宋体;">参?/span>:</p> <p><span style="font-family: 宋体;">q是一份你应该?/span>Android.mk<span style="font-family: 宋体;">中依赖或定义的变量列表,您可以定义其他变量ؓ自己使用Q?/span></p> <p><span style="font-family: 宋体;">但是</span>NDK<span style="font-family: 宋体;">~译pȝ保留下列变量名:</span></p> <p>-<span style="font-family: 宋体;">?/span>LOCAL_<span style="font-family: 宋体;">开头的名字Q例?/span> LOCAL_MODULE<span style="font-family: 宋体;">Q?/span></p> <p>-<span style="font-family: 宋体;">?/span>PRIVATE_, NDK_ or APP_<span style="font-family: 宋体;">开头的名字Q内部用)</span></p> <p>-<span style="font-family: 宋体;">写名字Q内部用,例如’</span>my-dir<span style="font-family: 宋体;">’Q?/span></p> <p><span style="font-family: 宋体;">如果您ؓ了方便在</span>Android.mk<span style="font-family: 宋体;">中定义自q变量Q我们徏议?/span>MY_<span style="font-family: 宋体;">前缀Q一个小例子Q?/span></p> <p>---------- cut here ------------------</p> <p>MY_SOURCES := foo.c</p> <p>ifneq ($(MY_CONFIG_BAR),)</p> <p>MY_SOURCES += bar.c</p> <p>endif</p> <p>LOCAL_SRC_FILES += $(MY_SOURCES)</p> <p>---------- cut here ------------------</p> <p>- - - - - - - - - - -</p> <p><span style="font-family: 宋体;">q些</span>GNU Make <span style="font-family: 宋体;">变量在你?/span>Android.mk<span style="font-family: 宋体;">文g解析之前Q就q译系l定义好了?/span></p> <p><span style="font-family: 宋体;">注意在某些情况下Q?/span>NDK<span style="font-family: 宋体;">可能分析</span>Android.mk<span style="font-family: 宋体;">几次Q每一ơ某些变量的定义会有不同?/span></p> <p><span style="color: red;">CLEAR_VARS</span></p> <p><span style="font-family: 宋体;">指向一个编译脚本,几乎所有未定义?/span>LOCAL_XXX<span style="font-family: 宋体;">变量都在</span>"Module-description"<span style="font-family: 宋体;">节中列出?/span></p> <p><span style="font-family: 宋体;">你必d开始一个新模块之前包含q个脚本?/span>include $(CLEAR_VARS)</p> <p> </p> <p><span style="color: red;">BUILD_SHARED_LIBRARY</span></p> <p><span style="font-family: 宋体;">指向~译脚本Q收集所有的你在</span>LOCAL_XXX<span style="font-family: 宋体;">变量中提供的信息Qƈ且决定如何把你列出的源代码文件编译成一个共享库。注意,你必至在包含q个文g之前定义</span>LOCAL_MODULE<span style="font-family: 宋体;">?/span>LOCAL_SRC_FILES<span style="font-family: 宋体;">Q用例子:</span></p> <p>include $(BUILD_SHARED_LIBRARY)</p> <p><span style="font-family: 宋体;">注意q将生成一个名?/span>lib$(LOCAL_MODULE).so<span style="font-family: 宋体;">的文件?/span></p> <p> </p> <p><span style="color: red;">BUILD_STATIC_LIBRARY</span></p> <p><span style="font-family: 宋体;">一?/span>BUILD_SHARED_LIBRARY<span style="font-family: 宋体;">变量用于~译一个静态库。静态库不会复制C?/span>project/packages<span style="font-family: 宋体;">中,诞生能够用于~译׃n库,Q看下面描述?/span>LOCAL_STATIC_LIBRARIES and LOCAL_STATIC_WHOLE_LIBRARIES<span style="font-family: 宋体;">Q?/span></p> <p><span style="font-family: 宋体;">使用例子Q?/span></p> <p>include $(BUILD_STATIC_LIBRARY)</p> <p><span style="font-family: 宋体;">注意Q这会生成一个名?/span>lib$(LOCAL_MODULE).a<span style="font-family: 宋体;">的文件?/span></p> <p> </p> <p><span style="color: red;">TARGET_ARCH</span></p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">目标</span>CPU<span style="font-family: 宋体;">q_的名字,如同?/span>android<span style="font-family: 宋体;">开放源码中指定的那栗如果是’</span>arm<span style="font-family: 宋体;">’Q表C生成</span>ARM<span style="font-family: 宋体;">兼容的指令,?/span>CPU<span style="font-family: 宋体;">架构的修订版无关?/span></p> <p style="text-indent: 21pt;"> </p> <p><span style="color: red;">TARGET_PLATFORM</span></p> <p style="text-indent: 21pt;">Android.mk<span style="font-family: 宋体;">解析的时候,目标</span>Android<span style="font-family: 宋体;">q_的名?/span>.<span style="font-family: 宋体;">详情可参?/span>/development/ndk/docs/stable-apis.txt.</p> <p style="text-indent: 21pt;">    android-3      -> Official Android 1.5 system images</p> <p style="text-indent: 21pt;">    android-4      -> Official Android 1.6 system images</p> <p style="text-indent: 21pt;">    android-5      -> Official Android 2.0 system images</p> <p style="text-indent: 21pt;"> </p> <p><span style="color: red;">TARGET_ARCH_ABI</span></p> <p><span style="font-family: 宋体;">暂时只支持两?/span>value<span style="font-family: 宋体;">Q?/span>armeabi<span style="font-family: 宋体;">?/span>armeabi-v7a<span style="font-family: 宋体;">。在现在的版本中一般把q两个值简单的定义?/span>arm<span style="font-family: 宋体;">Q通过</span>android <span style="font-family: 宋体;">q_内部对它重定义来获得更好的匹配?/span></p> <p><span style="font-family: 宋体;">其他的AQテ在以后的NQO版本中介l,它们会有不同的名字。注意所有基于AQԌ݋的AQテ都会?/span>'TARGET_ARCH'<span style="font-family: 宋体;">定义?#8216;ar?#8217;Q但是会有不同的‘</span>TARGET_ARCH_ABI<span style="font-family: 宋体;">’</span></p> <p> </p> <p><span style="color: red;">TARGET_ABI</span></p> <p><span style="font-family: 宋体;">  目标q_?/span>ABI<span style="font-family: 宋体;">的组合,它事实上被定义成</span>$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) <span style="font-family: 宋体;">在你惌在真实的讑֤中针对一个特别的目标pȝq行试Ӟ会有用。在默认的情况下Q它会是</span>'android-3-arm'<span style="font-family: 宋体;">?/span></p> <p> </p> <p> </p> <p>/*****************************************************************************/</p> <p><span style="font-family: 宋体;">下面?/span>GNU Make<span style="font-family: 宋体;"> ‘功能’宏,<span style="color: red;">必须通过使用</span></span><span style="color: red;">'$(call <function>)'</span><span style="color: red; font-family: 宋体;">来求?/span><span style="font-family: 宋体;">Q他们返回文本化的信息?/span></p> <p><strong>my-dir</strong></p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">q回当前</span>Android.mk<span style="font-family: 宋体;">所在的目录路径Q相对于QDQ编译系l的层。这是有用的Q在</span>Android.mk<span style="font-family: 宋体;">文g的开头如此定义:</span></p> <p>LOCAL_PATH := $(call my-dir)</p> <p> </p> <p><strong>all-subdir-makefiles</strong></p> <p><span style="font-family: 宋体;">   q回一个位于当?/span>'my-dir'<span style="font-family: 宋体;">路径的子目录列表。例如,看下面的目录层次Q?/span></p> <p>sources/foo/Android.mk</p> <p>sources/foo/lib1/Android.mk</p> <p>sources/foo/lib2/Android.mk</p> <p><span style="font-family: 宋体;">如果</span>sources/foo/Android.mk<span style="font-family: 宋体;">包含一?/span><span style="font-family: 宋体;">Q?/span></p> <p>include $(call all-subdir-makefiles)</p> <p><span style="font-family: 宋体;">那么它就会自动包?/span>sources/foo/lib1/Android.mk <span style="font-family: 宋体;">?/span>sources/foo/lib2/Android.mk</p> <p><span style="font-family: 宋体;">q项功能用于向编译系l提供深层次嵌套的代码目录层ơ。注意,在默认情况下QNQO会只搜索在</span>sources/*/Android.mk<span style="font-family: 宋体;">中的文g?/span></p> <p> </p> <p><strong>this-makefile</strong></p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">q回当前</span>Makefile<span style="font-family: 宋体;">的\径(卌个函数调用的地方Q?/span></p> <p style="text-indent: 21pt;"> </p> <p><strong>parent-makefile</strong></p> <p><span style="font-family: 宋体;">  q回调用树中?/span>Makefile<span style="font-family: 宋体;">路径。即包含当前</span>Makefile<span style="font-family: 宋体;">?/span>Makefile<span style="font-family: 宋体;">路径?/span></p> <p> </p> <p><strong>grand-parent-makefile</strong></p> <p><span style="font-family: 宋体;">猜猜?/span>...</p> <p> </p> <p> </p> <p>/*****************************************************************************/</p> <p><span style="font-family: 宋体;">模块描述变量</span>:</p> <p><strong><span style="color: red; font-family: 宋体;">下面的变量用于向~译pȝ描述你的模块。你应该定义?/span><span style="color: red;">'include $(CLEAR_VARS)'</span></strong><strong><span style="color: red; font-family: 宋体;">?/span><span style="color: red;">'include $(BUILD_XXXXX)'</span></strong><strong><span style="color: red; font-family: 宋体;">之间定义?/span></strong><span style="font-family: 宋体;">正如前面描写的那P</span>$(CLEAR_VARS<span style="font-family: 宋体;">是一个脚本,清除所有这些变量,除非在描qC昑ּ注明?/span></p> <p> </p> <p><span style="color: red;">LOCAL_PATH</span></p> <p><span style="font-family: 宋体;">  q个变量用于l出当前文g的\径。你必须?/span>Android.mk<span style="font-family: 宋体;">的开头定义,可以q样使用Q?/span></p> <p> </p> <p>LOCAL_PATH := $(call my-dir)</p> <p><span style="font-family: 宋体;">q个变量不会?/span>$(CLEAR_VARS)<span style="font-family: 宋体;">清除Q因此每?/span>Android.mk<span style="font-family: 宋体;">只需要定义一ơ(即你在一个文件中定义了几个模块的情况下)?/span></p> <p> </p> <p><span style="color: red;">LOCAL_MODULE</span></p> <p><strong><span style="font-family: 宋体;">q是你模块的名字Q它必须是唯一的,而且不能包含I格。你必须在包含Q一?/span>$(BUILD_XXXX)</strong><strong><span style="font-family: 宋体;">脚本之前定义?/span></strong><span style="font-family: 宋体;">。模块的名字军_了生成文件的名字Q例如,如果一个一个共享库模块的名字是</span><foo><span style="font-family: 宋体;">Q那么生成文件的名字是</span>lib<foo>.so<span style="font-family: 宋体;">。但是,在你?/span>NDK<span style="font-family: 宋体;">生成文g中(或?/span>Android.mk<span style="font-family: 宋体;">或?/span>Application.mk<span style="font-family: 宋体;">Q,你应该只涉及</span>(<span style="font-family: 宋体;">引用</span>)<span style="font-family: 宋体;">有正常名字的其他模块?/span></p> <p> </p> <p><span style="color: red;">LOCAL_SRC_FILES</span></p> <p><span style="font-family: 宋体;">q是要编译的源代码文件列表。只要列传递给~译器的文gQ因为编译系l自动ؓ你计依赖?/span></p> <p><span style="font-family: 宋体;">注意源代码文件名U都是相对于</span>LOCAL_PATH<span style="font-family: 宋体;">的,你可以用\径部分,例如Q?/span></p> <p>LOCAL_SRC_FILES := foo.c \</p> <p style="margin: 0cm 0cm 0pt 105pt; text-indent: 5.25pt;">toto/bar.c</p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">注意Q在生成文g中都要?/span>UNIX<span style="font-family: 宋体;">风格的斜?/span>(/).windows<span style="font-family: 宋体;">风格的反斜杠不会被正的处理?/span></p> <p style="text-indent: 21pt;"> </p> <p><span style="color: red;">LOCAL_CPP_EXTENSION</span></p> <p><span style="font-family: 宋体;">q是一个可选变量,用来指定</span>C++<span style="font-family: 宋体;">代码文g的扩展名Q默认是</span>'.cpp',<span style="font-family: 宋体;">但是你可以改变它Q比如:</span></p> <p style="text-indent: 21pt;">LOCAL_CPP_EXTENSION := .cxx</p> <p> </p> <p><span style="color: red;">LOCAL_C_INCLUDES </span></p> <p>       <span style="font-family: 宋体;">路径的可选配|,是从根目录开始的Q?/span></p> <p>    all sources (C, C++ and Assembly). For example:</p> <p>        LOCAL_C_INCLUDES := sources/foo</p> <p>    Or even:</p> <p>        LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo</p> <p>       <span style="font-family: 宋体;">需要在M包含</span>LOCAL_CFLAGS / LOCAL_CPPFLAGS<span style="font-family: 宋体;">标志之前?/span></p> <p> </p> <p><span style="color: red;">LOCAL_CFLAGS</span></p> <p><span style="font-family: 宋体;">可选的~译器选项Q在~译</span>C<span style="font-family: 宋体;">代码文g的时候用?/span></p> <p><span style="font-family: 宋体;">q可能是有用的,指定一个附加的包含路径Q相对于</span>NDK<span style="font-family: 宋体;">的顶层目录)Q宏定义Q或者编译选项?/span></p> <p><span style="font-family: 宋体;"> 重要信息Q不要在</span>Android.mk<span style="font-family: 宋体;">中改?/span>optimization/debugging<span style="font-family: 宋体;">U别Q只要在</span>Application.mk<span style="font-family: 宋体;">中指定合适的信息Q就会自动地Z处理q个问题Q在调试期间Q会让NQO自动生成有用的数据文件?/span></p> <p> </p> <p>LOCAL_CXXFLAGS</p> <p style="text-indent: 21pt;">Same as LOCAL_CFLAGS for C++ source files</p> <p> </p> <p>LOCAL_CPPFLAGS</p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">?/span>LOCAL_CFLAGS<span style="font-family: 宋体;">相同Q但是对</span>C <span style="font-family: 宋体;">和 </span>C++ source files<span style="font-family: 宋体;">都适用?/span></p> <p style="text-indent: 21pt;"> </p> <p><span style="color: red;">LOCAL_STATIC_LIBRARIES</span></p> <p><span style="font-family: 宋体;">应该链接到这个模块的静态库列表Q?/span>BUILD_STATIC_LIBRARY<span style="font-family: 宋体;">生成Q,q仅仅对׃n库模块才有意义?/span></p> <p> </p> <p><span style="color: red;">LOCAL_SHARED_LIBRARIES</span></p> <p><span style="font-family: 宋体;">q个模块在运行时要依赖的׃n库模块列表,在链接时需要,在生成文件时嵌入的相应的信息。注意:q不会附加列出的模块到编译图Q也是Q你仍然需要在</span>Application.mk<span style="font-family: 宋体;">中把它们d到程序要求的模块中?/span></p> <p> </p> <p><span style="color: red;">LOCAL_LDLIBS</span></p> <p><span style="font-family: 宋体;">~译你的模块要用的附加的链接器选项。这对于使用”</span>-l<span style="font-family: 宋体;">”前缀传递指定库的名字是有用的。例如,下面告诉链接器生成的模块要在加载时刻链接到</span>/system/lib/libz.so</p> <p>LOCAL_LDLIBS := -lz</p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">?/span>docs/STABLE-APIS.TXT<span style="font-family: 宋体;">获取你?/span>NDK<span style="font-family: 宋体;">发行版能链接到的开攄pȝ库列表?/span></p> <p style="text-indent: 21pt;"> </p> <p>LOCAL_ALLOW_UNDEFINED_SYMBOLS</p> <p><span style="font-family: 宋体;">  默认情况下,在试囄译一个共享库ӞM未定义的引用导致一?#8220;未定义的W号”错误。这对于在你的源代码文g中捕捉错误会有很大的帮助?/span></p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">然而,如果你因为某些原因,需要不启动q项查,把这个变量设?#8216;true’。注意相应的׃n库可能在q行时加载失败。(q个一般尽量不要去设ؓ</span>true<span style="font-family: 宋体;">Q?/span></p> <p style="text-indent: 21pt;"> </p> <p><span style="color: red;">LOCAL_ARM_MODE</span></p> <p>       <span style="font-family: 宋体;">默认情况下,</span>arm<span style="font-family: 宋体;">目标二进制会?/span>thumb<span style="font-family: 宋体;">的Ş式生成(</span>16<span style="font-family: 宋体;">位)Q你可以通过讄q个变量?/span>arm<span style="font-family: 宋体;">如果你希望你?/span>module<span style="font-family: 宋体;">是以</span>32<span style="font-family: 宋体;">位指令的形式?/span></p> <p style="text-indent: 21pt;">    'arm' (32-bit instructions) mode. E.g.:</p> <p style="text-indent: 21pt;">      LOCAL_ARM_MODE := arm</p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">注意你同样可以在~译的时候告诉系l编译特定的cd</span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">比如</span></p> <p style="text-indent: 21pt;">       LOCAL_SRC_FILES := foo.c bar.c.arm</p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">q样告诉系lL?/span>bar.c<span style="font-family: 宋体;">?/span>arm<span style="font-family: 宋体;">的模式编译,</span></p> <p style="text-indent: 21pt;"> </p> <p style="text-indent: 21pt;"> </p> <p><strong><span style="font-size: 12pt;">Android.mk</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">使用模板</span></strong></p> <p><span style="font-family: 宋体;">在一?/span>Android.mk<span style="font-family: 宋体;">中可以生成多个可执行E序、动态库和静态库?/span></p> <p>1<span style="font-family: 宋体;">Q编译应用程序的模板Q?/span></p> <p>     #Test Exe</p> <p>     LOCAL_PATH := $(call my-dir)</p> <p>     #include $(CLEAR_VARS)</p> <p>     LOCAL_SRC_FILES:= main.c</p> <p>     LOCAL_MODULE:= test_exe</p> <p>     #LOCAL_C_INCLUDES :=</p> <p>     #LOCAL_STATIC_LIBRARIES :=</p> <p>     #LOCAL_SHARED_LIBRARIES :=</p> <p>     include $(BUILD_EXECUTABLE)</p> <p><span style="font-family: 宋体;">Q菜鸟别解释:</span>:=<span style="font-family: 宋体;">是赋值的意思,</span>$<span style="font-family: 宋体;">是引用某变量的|</span>LOCAL_SRC_FILES<span style="font-family: 宋体;">中加入源文g路径Q?/span>LOCAL_C_INCLUDES <span style="font-family: 宋体;">中加入所需要包含的头文件\径,</span>LOCAL_STATIC_LIBRARIES<span style="font-family: 宋体;">加入所需要链接的静态库Q?/span>*.a<span style="font-family: 宋体;">Q的名称Q?/span>LOCAL_SHARED_LIBRARIES<span style="font-family: 宋体;">中加入所需要链接的动态库Q?/span>*.so<span style="font-family: 宋体;">Q的名称Q?/span>LOCAL_MODULE<span style="font-family: 宋体;">表示模块最l的名称Q?/span>BUILD_EXECUTABLE<span style="font-family: 宋体;">表示以一个可执行E序的方式进行编译?/span></p> <p>2<span style="font-family: 宋体;">Q编译静态库的模板:</span></p> <p>     #Test Static Lib</p> <p>     LOCAL_PATH := $(call my-dir)</p> <p>     include $(CLEAR_VARS)</p> <p>     LOCAL_SRC_FILES:= \</p> <p>               helloworld.c</p> <p>     LOCAL_MODULE:= libtest_static</p> <p>     #LOCAL_C_INCLUDES :=</p> <p>     #LOCAL_STATIC_LIBRARIES :=</p> <p>     #LOCAL_SHARED_LIBRARIES :=</p> <p>     include $(BUILD_STATIC_LIBRARY)</p> <p><span style="font-family: 宋体;">一般的和上面相|</span>BUILD_STATIC_LIBRARY<span style="font-family: 宋体;">表示~译一个静态库?/span></p> <p>3<span style="font-family: 宋体;">Q编译动态库的模板:</span></p> <p>     #Test Shared Lib</p> <p>     LOCAL_PATH := $(call my-dir)</p> <p>     include $(CLEAR_VARS)</p> <p>     LOCAL_SRC_FILES:= \</p> <p>               helloworld.c</p> <p>     LOCAL_MODULE:= libtest_shared</p> <p>     TARGET_PRELINK_MODULES := false</p> <p>     #LOCAL_C_INCLUDES :=</p> <p>     #LOCAL_STATIC_LIBRARIES :=</p> <p>     #LOCAL_SHARED_LIBRARIES :=</p> <p>      include $(BUILD_SHARED_LIBRARY)</p> <p><span style="font-family: 宋体;">一般的和上面相|</span>BUILD_SHARED_LIBRARY<span style="font-family: 宋体;">表示~译一个共享库?/span></p> <p> </p> <p><span style="font-family: 宋体;">以上三者的生成l果分别在如下,</span>generic<span style="font-family: 宋体;">依具?/span>target<span style="font-family: 宋体;">会变Q?/span></p> <p>out/target/product/generic/obj/EXECUTABLE</p> <p>out/target/product/generic/obj/STATIC_LIBRARY</p> <p>out/target/product/generic/obj/SHARED_LIBRARY</p> <p>      <span style="font-family: 宋体;">每个模块的目标文件夹分别为:</span></p> <p><span style="font-family: 宋体;">可执行程序:</span>XXX_intermediates</p> <p><span style="font-family: 宋体;">静态库Q?/span>      XXX_static_intermediates</p> <p><span style="font-family: 宋体;">动态库Q?/span>      XXX_shared_intermediates</p> <p>      <span style="font-family: 宋体;">另外Q在</span>Android.mk<span style="font-family: 宋体;">文g中,q可以指定最后的目标安装路径Q用</span>LOCAL_MODULE_PATH<span style="font-family: 宋体;">?/span>LOCAL_UNSTRIPPED_PATH<span style="font-family: 宋体;">来指定。不同的文gpȝ路径用以下的宏进行选择Q?/span></p> <p>TARGET_ROOT_OUT<span style="font-family: 宋体;">Q表C根文gpȝ?/span></p> <p>TARGET_OUT<span style="font-family: 宋体;">Q表C?/span>system<span style="font-family: 宋体;">文gpȝ?/span></p> <p>TARGET_OUT_DATA<span style="font-family: 宋体;">Q表C?/span>data<span style="font-family: 宋体;">文gpȝ?/span></p> <p><span style="font-family: 宋体;">用法如:</span></p> <p> LOCAL_MODULE_PATH:=$(TARGET_ROOT_OUT)</p> <p> </p><img src ="http://www.shnenglu.com/tdweng/aggbug/147176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/tdweng/" target="_blank">心羽</a> 2011-05-26 11:47 <a href="http://www.shnenglu.com/tdweng/articles/147176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android架构详细讲解http://www.shnenglu.com/tdweng/articles/141569.html心羽心羽Fri, 11 Mar 2011 07:51:00 GMThttp://www.shnenglu.com/tdweng/articles/141569.htmlhttp://www.shnenglu.com/tdweng/comments/141569.htmlhttp://www.shnenglu.com/tdweng/articles/141569.html#Feedback0http://www.shnenglu.com/tdweng/comments/commentRss/141569.htmlhttp://www.shnenglu.com/tdweng/services/trackbacks/141569.html在Android 在NDK r5使用C/C++q行开发。(以前QAndroid 对C/C++开发的支持仅限于用C/C++开发动态链接库Q然后在Java中以JNI的Ş式来调用Q现在,你可以用UC/C++开发了Q参看下面的E序代码Q。还有一D完整的代码CZ在这里(墙,q有XML的manifestQ又见XMLQ?span style="COLOR: #ff0000">看来QGooglel于明白Z么用Android的手机(如:Moto, 三星、烦爱和HTCQ的触摸体验q远不及object C搞出来的iPhone?nbsp;

void android_main(struct android_app* state) {

    // Make sure glue isn't stripped.

    app_dummy();

    // loop waiting for stuff to do.

    while (1) {

        // Read all pending events.

        int ident;

        int events;

        struct android_poll_source* source;

       // Read events and draw a frame of animation.

        if ((ident = ALooper_pollAll(0, NULL, &events,

                (void**)&source)) >= 0) {

            // Process this event.

            if (source != NULL) {

                source->process(state, source);

            }

        }

        // draw a frame of animation

        bringTheAwesome();

    }

}

------------------------------------------------------------------------------------

Androidpȝ架构?span style="COLOR: #ff0000">5部分l成Q分别是QLinux Kernel、Android Runtime、Libraries、Application Framework、Applications?/span>
 
1、Linux Kernel
  AndroidZLinux 2.6提供核心pȝ服务Q例如:安全、内存管理、进E管理、网l堆栈、驱动模型。Linux Kernel也作为硬件和软g之间的抽象层Q它隐藏具体gl节而ؓ上层提供l一的服务?如果你学q计机|络知道OSI/RMQ就会知道分层的好处是使用下层提供的服务而ؓ上层提供l一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响C层。也是说各层各其职,各层提供固定的SAPQService Access PointQ,专业点可以说是高内聚、低耦合?如果你只是做应用开发,׃需要深入了解Linux Kernel层?
 
  2、Android Runtime
  Android包含一个核心库的集合,提供大部分在Java~程语言核心cd中可用的功能。每一个Android应用E序是Dalvik虚拟Z的实例,q行在他们自qq程中。Dalvik虚拟计成Q在一个设备可以高效地q行多个虚拟机。Dalvik虚拟机可执行文g格式?dexQdex格式是专为Dalvik设计的一U压~格式,适合内存和处理器速度有限的系l?大多数虚拟机包括JVM都是Z栈的Q而Dalvik虚拟机则是基于寄存器的。两U架构各有优劣,一般而言Q基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工P可以?Java .class 转换?.dex 格式。一个dex文g通常会有多个.class。由于dex有时必须q行最佛_Q会使文件大增?-4倍,以ODEXl尾?Dalvik虚拟Z赖于Linux 内核提供基本功能Q如U程和底层内存管理?/div>
 
  3、Libraries
  Android包含一个C/C++库的集合Q供Androidpȝ的各个组件用。这些功能通过Android的应用程序框Ӟapplication frameworkQ暴露给开发者。下面列Z些核心库Q?pȝC?-标准Cpȝ库(libcQ的BSD衍生Q调整ؓZ嵌入式Linux讑֤ 媒体?-ZPacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文Ӟ包括MPEG4?H.264?MP3?AAC?AMR、JPG?PNG 界面理--理讉K昄子系l和无缝l合多个应用E序的二l和三维囑Ş?LibWebCore--新式的Web览器引?驱动Android 览器和内嵌的web视图 SGL--基本?D囑Ş引擎 3D?-ZOpenGL ES 1.0 APIs的实现。库使用g3D加速或包含高度优化?D软g光栅 FreeType --位图和矢量字体渲?SQLite --所有应用程序都可以使用的强大而轻量的关pL据库引擎
 
  4、Application Framework
  通过提供开攄开发^収ͼAndroid使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用讑֤g优势、访问位|信息、运行后台服务、设|闹钟、向状态栏d通知{等Q很多很多?开发者可以完全用核心应用程序所使用的框架APIs。应用程序的体系l构旨在化组件的重用QQ何应用程序都能发布他的功能且M其他应用E序可以使用q些功能Q需要服从框架执行的安全限制Q。这一机制允许用户替换lg?所有的应用E序其实是一l服务和pȝQ包括: 视图QViewQ?-丰富的、可扩展的视N合,可用于构Z个应用程序。包括包括列表、网根{文本框、按钮,甚至是内嵌的|页览?内容提供者(Content ProvidersQ?-使应用程序能讉K其他应用E序Q如通讯录)的数据,或共享自q数据 资源理器(Resource ManagerQ?-提供讉K非代码资源,如本地化字符丌Ӏ图形和布局文g 通知理器(Notification ManagerQ?-使所有的应用E序能够在状态栏昄自定义警?zd理器(Activity ManagerQ?-理应用E序生命周期,提供通用的导航回退功能
 
  5、Applications
  Android装配一个核心应用程序集合,包括电子邮g客户端、SMSE序、日历、地图、浏览器、联pMh和其他设|。所有应用程序都是用Java~程语言写的。更加丰富的应用E序有待我们d发! 从上面我们知道Android的架构是分层的,非常清晰Q分工很明确。Android本n是一套Y件堆q?Software Stack)Q或UCؓ「Y件P层架构」,q层主要分成三层Q操作系l、中间g、应用程序。从上面我们也看C开源的力量Q一个个熟悉的开源Y件在q里贡献了自q一份力量?/div>


心羽 2011-03-11 15:51 发表评论
]]> WWWAVþþӰƬ| ĻƷþ| ޹þ| ݺ޾þþþþۺ| ɫʹþۺ| þþþþϸApp| ŷִִþþ| þerƷѹۿ2| Ʒvaþþþþþ| þֻоƷ4| þþƷ69Ʒ| һaɫƬþ| þó鱬Ļ| պŷþ| þùƷ99| Ʒþþþþþù˽| þó˹Ʒ| ٸŮþۺɫ| һ㽶þֻ| ˾þô߽avӰԺ| ũ帾ŮëƬƷþ| Ʒþþþþ| ޾ƷþþþþĻ| ҹƷþþþþþС˵| 볬鱬Ļþ| ޾Ʒ97þĻ| Ʒþþþþۺձ| þþƷ| ŷƷž99þڹۿ| þӰԺһ| bƷþþþþþ| ˾ھƷþþþ| þþƷҹһ| þþþþAv뾫Ʒר| ձ޿һþ| þþƷŷպ| һƷþð͹| Ʒþþþþ| þۺۺϾþ97ɫ| þ97þ97Ʒӿϼ | ƷþþþþĻ|