
![]()
xuhaoran0213
接受
1. 建立编译环境
编译环境: Ubuntu 10.10
Android版本: Android 2.2
在编译过程中android应用程序编译,可能需要在Ubuntu上安装一些必要的软件. 我安装的软件包括以下软件. 不同的系统可能会有差异:
jdk6(Android官方建议安装jdk5,但编译时我会遇到Java覆盖问题,6没问题),野牛,lib64z1-dev,libasound2-dev,flex,gperf,libncurses5-dev p>
2. 应用程序存储目录
SimpleJNI是用Android NDK和Java编写的程序,包括apk等库文件,其源代码位于源树的development / samples /目录中.
实际上,在编译过程中放置软件包的目录没有明确定义. 编译后apk等的存储位置取决于目录中Android.mk指定的编译类型,例如:
Android.mk中的SimpleJNI根目录目录中有一行$(BUILD_PACKAGE),这意味着该目录中的模块已编译为包,即apk文件,默认存储位置为/ system /应用.
在SimpleJNI / jni目录的Android.mk中有一行包括$(BUILD_SHARED_LIBRARY),这意味着该目录中的native.cpp被编译为共享库文件,即so文件. 默认位置是/ system / lib
因此,如果要编译写入映像中的程序,我们只需要将在Eclipse下完成的整个项目复制到源代码树下的目录中,而我通常在软件包/应用程序下使用它.
3. 添加Android.mk
完成上一步后,您可以知道Android.mk在编译中起着至关重要的作用,它实际上是Android编译环境中的make文件. 为了完成我们的工作android应用程序编译,我们需要在源代码中添加Android.mk. 添加您自己的Android.mk可以在SimpleJNI中模仿Android.mk,只需对其稍加修改即可. 让我们首先看一下SimpleJNI目录下两个Android.mk的内容:
Android.mk在根目录中
TOP_LOCAL_PATH: = $(调用my-dir)
#构建活动
LOCAL_PATH: = $(TOP_LOCAL_PATH)
包括$(CLEAR_VARS)

LOCAL_MODULE_TAGS: =个样本
LOCAL_SRC_FILES: = $(调用all-subdir-java-files)
LOCAL_PACKAGE_NAME: = SimpleJNI
LOCAL_JNI_SHARED_LIBRARIES: = libsimplejni
LOCAL_PROGUARD_ENABLED: =已禁用
包括$(BUILD_PACKAGE)
#============================================== ==== =============
#还要在该子目录下构建所有子目标: 共享库.
包括$(调用所有makefiles-under,$(LOCAL_PATH))
根目录中的
Android.mk确定整个项目编译的配置,
LOCAL_PATH定义当前目录
LOCAL_MUDULE_TAGS定义当前模块的类型,编译器根据编译时的类型而有所不同,并且某些标记模块甚至都不会编译到系统中. LOCAL_MUDULE_TAGS主要具有以下类型: 用户调试引擎测试可选样本shell_ash shell_mksh. 可选表示将在所有版本的编译条件下将其编译到映像中,其余表示仅在此版本中将其编译到映像中,例如user表示将在用户版本下将其编译到映像中
对于包含LOCAL_PACKAGE_NAME的mk文件,此项目默认为optimal. 有关详细信息,请参见build / core / package.mk. 我也不清楚在SimpleJNI中定义为样本的特定角色. 为了保险起见,我自己的apk通常定义为可选.
LOCAL_SRC_FILES定义了编译apk所需的Java代码的目录
此处的LOCAL_PACKAGE_NAME需要更改为您的包裹名称
LOCAL_JNI_SHARED_LIBRARIES定义要包含的so库文件的名称. 如果您的程序不使用JNI,则不需要此行.
LOCAL_PROGUARD_ENABLED在Java开发中定义ProGuard压缩方法,该方法主要用于分析压缩程序. 我没有在自己的应用程序中添加此行.
include $(BUILD_PACKAGE)这行是构建的关键,这意味着当前的Java代码已内置到apk中.
include $(调用all-makefiles-under,$(LOCAL_PATH))表示您需要在此目录的子目录中构建文件,以便编译系统将在当前目录的子目录中找到Android.mk进行编译等等. 其他程序.
基于上述内容,按如下所示创建我自己的Android.mk:

TOP_LOCAL_PATH: = $(调用my-dir)
#构建活动
LOCAL_PATH: = $(TOP_LOCAL_PATH)
包括$(CLEAR_VARS)
LOCAL_MODULE_TAGS: =可选
LOCAL_SRC_FILES: = $(调用all-subdir-java-files)
LOCAL_PACKAGE_NAME: = TestJniApp
LOCAL_JNI_SHARED_LIBRARIES: = libtestjniapp
包括$(BUILD_PACKAGE)
#============================================== ==== =============
#还要在该子目录下构建所有子目标: 共享库.
包括$(调用所有makefiles-under,$(LOCAL_PATH))
它看起来非常简单,基本上不需要更改.
Jni目录下的Android.mk
由于我们的TestJniApp已使用JNI完成并包含C源代码,因此在jni目录中还需要一个Android.mk. 还要首先查看SimpleJNI的jni目录中Android.mk的内容:
LOCAL_PATH: = $(调用my-dir)
包括$(CLEAR_VARS)
LOCAL_MODULE_TAGS: =个样本
#这是正在建立的目标.
LOCAL_MODULE: = libsimplejni
#我们将编译的所有源文件.

LOCAL_SRC_FILES: = /
native.cpp
#我们链接的所有共享库.
LOCAL_SHARED_LIBRARIES: = /
libutils
#没有静态库.
LOCAL_STATIC_LIBRARIES: =
#还需要JNI标头.
LOCAL_C_INCLUDES + = /
$(JNI_H_INCLUDE)
#没有特殊的编译器标志.
LOCAL_CFLAGS + =
#不预链接此库. 要获得更高效的代码,您可能需要
#将此库添加到预链接映射并将其设置为true. 但是,
#对于未提供的应用程序很难做到这一点
#部分系统映像.
LOCAL_PRELINK_MODULE: =错误
包括$(BUILD_SHARED_LIBRARY)
LOCAL_MODULE当前模块的名称,即已编译的so文件的名称
要编译的LOCAL_SRC_FILES个文件
LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES此模块将链接的动态库和静态库.

要包含的LOCAL_C_INCLUDES头文件
LOCAL_CFLAGS C语言编译选项
LOCAL_PRELINK_MODULE定义是否使用预链接工具,该工具使用预链接而不是运行时链接来加速共享库的加载,这不仅可以加快启动速度,还可以减少一些内存开销.
修改后,我自己的TestJniApp的jni目录中的Android.mk如下:
LOCAL_PATH: = $(调用my-dir)
包括$(CLEAR_VARS)
LOCAL_MODULE: = libtestjniapp
LOCAL_SRC_FILES: = com_test_app_Jni.c
LOCAL_C_INCLUDES + = $(JNI_H_INCLUDE)
LOCAL_PRELINK_MODULE: =错误
包括$(BUILD_SHARED_LIBRARY)
这里要注意的一件事,如果要将so文件编译到映像中,则必须修改LOCAL_MODULE_TAGS,修改原始值样本给用户,或者可以直接将其删除. 删除是因为对于包含LOCAL_MODULE的mk文件,如果未指定LOCAL_MODULE_TAGS,则默认值为user,并且只有将so文件定义为user时,so文件才会编译到映像中. 有关特定的定义,请参见build / core / base_rule. mk.
4. 修改/bulid/target/product/generic.mk,将项目编译到系统中
这时,有最后一项工作. 为了将项目编译到映像中,您还需要在/bulid/target/product/generic.mk文件中添加包名称
PRODUCT_PACKAGES: = /
AccountAndSyncSettings /
CarHome /
桌面时钟/
......
SyncProvider /
TestJniApp
完成上述步骤后,在源树的根目录中编译映像.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-223302-1.html
开玩笑
我们的钱不值钱了
人渣一个
先进些