




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何将Android应用程序编译至image/rom中有时我们希望将自己的Android应用程序编译至image/rom中,这样程序将被安装至/system/app目录下,并且不能被卸载。下面我以自己的程序TestJniApp为例子,仿照源代码中自带的SimpleJNI,演示一下怎样将自己的应用程序编译至rom中。1. 搭建编译环境编译环境: Ubuntu 10.10Android版本:Android 2.2编译过程中可能需要在Ubuntu上安装必要的一些软件,我安装过的包含如下软件,不同的系统可能会有差别:jdk6(Android官方建议装jdk5,但是我在编译时会遇到Java override问题,改用6没有任何问题), bison, lib64z1-dev, libasound2-dev, flex, gperf, libncurses5-dev2. 应用程序存放目录SimpleJNI是采用Android NDK和Java编写的程序,包含apk和so库文件,它的源代码在source tree的development/samples/目录下。实际上package在编译时所放的目录并没有明确限定,编译后apk和so存放的位置是根据目录下Android.mk所指定的编译类型所决定的,例如: SimpleJNI根目录下的Android.mk中有一行include $(BUILD_PACKAGE),表示将该目录下的模块编译成package,即apk文件,默认存放的位置为/system/app。 SimpleJNI/jni目录下的Android.mk中有一行为include $(BUILD_SHARED_LIBRARY),表示将该目录下的native.cpp编译为共享库文件,即so文件,默认存放的位置为/system/lib因此,如果我们想要将自己编写的程序编译至image中,只需要将Eclipse下完成的整个工程copy到source tree下的某个目录即可,我一般习惯放到packages/apps下。3. 添加Android.mk完成了上一步,可以知道,Android.mk在编译中起着至关重要的作用,这其实就是Android编译环境中的make file。为了完成我们的工作,需要在源代码中添加Android.mk。添加自己的Android.mk可以仿照SimpleJNI中的Android.mk,稍微修改即可。我们首先看看SimpleJNI目录下的两个Android.mk的内容: 根目录下的Android.mk TOP_LOCAL_PATH:= $(call my-dir)# Build activityLOCAL_PATH:= $(TOP_LOCAL_PATH)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := samplesLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := SimpleJNILOCAL_JNI_SHARED_LIBRARIES := libsimplejniLOCAL_PROGUARD_ENABLED := disabledinclude $(BUILD_PACKAGE)# =# Also build all of the sub-targets under this one: the shared library.include $(call all-makefiles-under,$(LOCAL_PATH)根目录下的Android.mk决定了整个工程编译的配置,其中,LOCAL_PATH 定义了当前的目录LOCAL_MUDULE_TAGS 定义了当前模块的类型,编译器在编译时会根据类型的不同有些差别,有些tags的module甚至不会被编译至系统中。LOCAL_MUDULE_TAGS主要有如下几种:user debug eng tests optional samples shell_ash shell_mksh。optional表示在所有版本的编译条件下都被编译至image中,剩下的表示在该版本中才会被编译只image中,如user表示在user版本下才会被编译至image中。对于包含LOCAL_PACKAGE_NAME的mk文件,该项默认为optinal,具体可以参看build/core/package.mk。SimpleJNI中定义为samples的具体作用我也不太清楚,为了保险起见,我自己的apk一般定义为optional。LOCAL_SRC_FILES 定义了编译apk所需要的java代码的目录LOCAL_PACKAGE_NAME 这里需要改成自己的package的名字LOCAL_JNI_SHARED_LIBRARIES 定义了要包含的so库文件的名字,如果你的程序没有采用JNI,这行不需要。LOCAL_PROGUARD_ENABLED 定义了Java开发中的ProGuard压缩方法,主要用来分析压缩程序的,在我自己的应用中我没有加这行。include $(BUILD_PACKAGE) 这行是build的关键,表示当前java代码build成apkinclude $(call all-makefiles-under,$(LOCAL_PATH) 表示需要build该目录下的子目录的文件,这样编译系统就会在当前目录下的子目录寻找Android.mk来编译so等其它程序。根据上述所写,创建我自己的Android.mk如下:TOP_LOCAL_PATH:= $(call my-dir)# Build activityLOCAL_PATH:= $(TOP_LOCAL_PATH)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := TestJniAppLOCAL_JNI_SHARED_LIBRARIES := libtestjniappinclude $(BUILD_PACKAGE)# =# Also build all of the sub-targets under this one: the shared library.include $(call all-makefiles-under,$(LOCAL_PATH)看起来很简单吧,基本不需要改动即可。 Jni目录下的Android.mk 由于我们的TestJniApp是用JNI完成的,包含C源代码,因此也需要一个jni目录下的Android.mk。同样首先看看SimpleJNI中jni目录下的Android.mk的内容:LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := samples# This is the target being built.LOCAL_MODULE:= libsimplejni# All of the source files that we will compile.LOCAL_SRC_FILES:= native.cpp# All of the shared libraries we link against.LOCAL_SHARED_LIBRARIES := libutils# No static libraries.LOCAL_STATIC_LIBRARIES :=# Also need the JNI headers.LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)# No special compiler flags.LOCAL_CFLAGS +=# Dont prelink this library. For more efficient code, you may want# to add this library to the prelink map and set this to true. However,# its difficult to do this for applications that are not supplied as# part of a system image.LOCAL_PRELINK_MODULE := falseinclude $(BUILD_SHARED_LIBRARY)LOCAL_MODULE 当前模块的名字,即编译后的so文件的名字LOCAL_SRC_FILES 所要编译的文件LOCAL_SHARED_LIBRARIES, LOCAL_STATIC_LIBRARIES 该模块要链接的动态库和静态库。LOCAL_C_INCLUDES 要包含的头文件LOCAL_CFLAGS C语言编译选项LOCAL_PRELINK_MODULE 定义是否使用prelink工具,它用事先链接代替运行时链接的方法来加速共享库的加载,不仅可以加快起动速度,还可以减少部分内存开销。经过修改后,我自己的TestJniApp中jni目录下的Android.mk如下:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := libtestjniappLOCAL_SRC_FILES := com_test_app_Jni.cLOCAL_C_INCLUDES += $(JNI_H_INCLUDE)LOCAL_PRELINK_MODULE := falseinclude $(BUILD_SHARED_LIBRARY)这里有一点需要注意,如果要将so文件编译入image,必须要修改LOCAL_MODULE_TAGS,将原有的值samples修改为user,或者可以直接删掉。这是因为对于包含LOCAL_MODULE的mk文件,该项默认为user,具体定义可以参看build/core/base_rule.mk。4. 修改/bulid/target/product/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025成人高考试题数学及答案
- 2025年注册会计师(CPA)考试 会计科目模拟试题集:实战演练提升应试能力
- 2025江苏苏州市相城招商(集团)有限公司人员招聘模拟试卷附答案详解(典型题)
- 2025广东珠海高新区科技产业局招聘合同制职员2人模拟试卷附答案详解(模拟题)
- 2025北京市朝阳区教育委员会所属事业单位招聘毕业生394人考前自测高频考点模拟试题参考答案详解
- 2025湖南凤凰县直机关事业单位选调40人模拟试卷附答案详解(考试直接用)
- 2025北京市怀柔区卫生健康委员会所属事业单位第二批招聘医务人员4人考前自测高频考点模拟试题及一套完整答案详解
- 2025广西玉林市北流市清湾镇便民服务中心招聘公益性岗位模拟试卷及答案详解(有一套)
- 2025辽宁沈阳瑞恩科技公司所属单位高校毕业生招聘130人考前自测高频考点模拟试题及答案详解(全优)
- 2025年上海城投集团社会招聘模拟试卷及答案详解(各地真题)
- 型钢混凝土结构钢筋施工
- 石群邱关源电路(第1至7单元)白底课件
- JJF 1338-2012相控阵超声探伤仪校准规范
- GB/T 40529-2021船舶与海洋技术起货绞车
- GB 31603-2015食品安全国家标准食品接触材料及制品生产通用卫生规范
- 关于公布2016年度中国电力优质工程奖评审结果的通知
- 港口集团绩效考核方案
- 送达地址确认书(诉讼类范本)
- 2023版北京协和医院重症医学科诊疗常规
- 三坐标测量基础知识(基础教育)
- 宜家战略分析(课堂PPT)
评论
0/150
提交评论