Android下编译自己的库文件jar并在应用中调用

主要为了解决如下问题:

项目中使用了Android未公开的API,在Eclipse下会有红叉显示。

不同的项目抽出相同部分的代码共用。

必需的前提条件:

需要有Android源代码,编译的库文件主要是封装未公开API或者共用代码。

工程1:Java库文件工程

该工程最终会生成以jar结尾的Java库文件,并会被安装到设备的以下目录:

/system/framework/

另外还会安装相关库文件的说明文件,使系统能够找到库文件:

/system/etc/permissions/

1、建立工程

在Eclipse下新建一个空的Java工程。

在工程的

JavaBuildPath->Libraries

下,导入Android的SDK中的android.jar库。

为工程创建相应的包和java文件。

下面假设包路径为com.mytest.lib,最终生成的库为mylib.jar。

2、为工程添加注册文件

在库文件工程的根目录下创建以下文件:

<permissionxmlfilename>.xml

该文件是用来向系统注册库用的,名称可以自己定,在下面假设该文件为mylibxml.xml。

在文件中加入以下内容:

<?xmlversion="1.0"encoding="UTF-8"?>

<permissions>

<library

name="com.mytest.lib"

file="/system/framework/mylib.jar"

/>

</permissions>

其中的library用于将其下的name和file两个属性关联起来,name的值后边会用到。

这里的name指定为工程的包名。

这里的file指定为库文件的存放路径,应该是:

/system/framework/<jarfilename>.jar

3、为工程添加makefile文件:

在库文件工程的根目录下创建以下文件:

Android.mk

该文件是用来编译工程的,名称固定。

在文件中加入以下内容:

LOCAL_PATH:=$(callmy-dir)

#MAKE_JAR

include$(CLEAR_VARS)

LOCAL_SRC_FILES:=$(callall-subdir-java-files)

LOCAL_MODULE:=mylib

include$(BUILD_JAVA_LIBRARY)

#MAKE_XML

include$(CLEAR_VARS)

LOCAL_MODULE:=mylibxml.xml

LOCAL_MODULE_CLASS:=ETC

LOCAL_MODULE_PATH:=$(TARGET_OUT_ETC)/permissions

LOCAL_SRC_FILES:=$(LOCAL_MODULE)

include$(BUILD_PREBUILT)

其中,MAKE_JAR部分的LOCAL_MODULE部分指定为想要生成的库文件的名字,

需要与.xml文件中的library下的file部分一致。

其中,MAKE_XML部分的LOCAL_MODULE部分指定为用于注册库的.xml文件。

4、生成应用程序可用的库文件

此时的工程,如果使用了未公开的API的话,在eclipse下应该是有红叉的。

这些错误不用管,只需要保证程序在Android的源码下能够编译通过即可。

将工程的java文件以及.xml和.mk按照目录结构拷贝到以下目录:

<Androidsourcefolder>/packages/apps/<projectname>/

运行以下命令:

$cd<Androidsourcefolder>

$../build/envsetup.sh

$mmmpackages/apps/<projectname>

将会生成一个.jar文件和一个.xml文件。

以上两个文件是应用程序在运行时需要用到的。

调试应用前,需要将两个文件拷贝到设备的相应目录上去:

.jar文件:/system/framework/

.xml文件:/system/etc/permissions/

拷贝到设备使用以下命令:

$sudoadbpush<.jaror.xmlfilepath><pathindevice>

拷贝完以后需要重启设备。

5、生成在Eclipse可以引用的库文件

在源码下编译的.jar文件在Eclipse中是不能使用的,需要单独生成。

在Eclipse下选中工程根目录,选择文件菜单中的导出Export,然后选择jar类型。

导出为jar文件时,只需要选中相应的java文件即可。

这样生成的jar文件仅仅供应用程序在Eclipse下使用,除非是以下情况:

库文件没有使用非公开的API,并且,

应用本身在Eclipse下编译就能够使用,不需要到源码下编译。

暂且为该文件命名为mylibtemp.jar

工程2:Android应用工程

1、建立工程

新建一个Android工程。

在工程的

JavaBuildPath->Libraries

下,导入mylibtemp.jar库。

使用mylibtemp.jar中的类编写代码。

下面假设最后生成的应用程序文件为myapp.apk。

2、编辑AndroidManifest.xml文件

编辑工程根目录下的AndroidManifest.xml文件。

在application下添加以下内容:

<uses-library

android:name="com.mytest.lib">

</uses-library>

其中的:name表示所引用的库文件的包名。

其与库工程的.xml文件中的name应该是一致的。

这样在应用运行时就能够找到相应的.jar文件了。

如果引用了多个库,需要添加多个uses-library标签。

3、为工程添加makefile文件:

在库文件工程的根目录下创建以下文件:

Android.mk

该文件是用来编译工程的,名称固定。

在文件中加入以下内容:

LOCAL_PATH:=$(callmy-dir)

include$(CLEAR_VARS)

LOCAL_SRC_FILES:=$(callall-java-files-under,src)

LOCAL_JAVA_LIBRARIES:=mylib

LOCAL_PACKAGE_NAME:=myapp

LOCAL_CERTIFICATE:=platform

include$(BUILD_PACKAGE)

其中的LOCAL_JAVA_LIBRARIES表示程序会用到的库文件。

其名成与库工程下的.mk文件中MAKE_JAR部分下的LOCAL_MODULE应该是一致的。

其中的LOCAL_PACKAGE_NAME表示应用最后生成的名称。

4、编译应用程序

将工程的src、res、assets文件夹以及文件:

Android.mk和AndroidManifest.xml

按照目录结构拷贝到以下目录:

<Androidsourcefolder>/packages/apps/<projectname>/

引用的.jar库文件并不需要。

运行以下命令:

$cd<Androidsourcefolder>

$../build/envsetup.sh

$mmmpackages/apps/<projectname>

将会生成一个.apk文件。

运行以下命令将应用安装到设备:

$sudoadbinstall[-r]<apkfilepath>

相关推荐