Android 开发者网站:http://developer.android.com/tools/projects/index.html 中的源代码,Library Projects 部分:
"... 在结构上,库项目类似于标准的 Android
应用项目。例如,它在
项目根目录,以及 src/、res/ 和类似目录。这
项目可以包含与项目相同类型的源代码和资源
标准的 Android 项目,以相同的方式存储。例如,源
库项目中的代码可以通过其 R 访问自己的资源
类。
但是,库项目不同于标准的 Android 应用程序
项目,因为您无法将其直接编译为自己的 .apk 并运行
它在 Android 设备上。同样,您不能导出库
项目到一个独立的 JAR 文件,就像你会做一个真正的
图书馆。相反,您必须通过间接编译库
在依赖应用程序中引用库并构建它
应用。
当您构建依赖于库项目的应用程序时,
SDK 工具将库编译成一个临时 JAR 文件并在
主项目,然后使用结果生成 .apk。在案件
其中资源 ID 在应用程序和
库中,工具确保在
应用程序获得优先权,并且库项目中的资源
未编译到应用程序 .apk 中。这使您的应用程序
使用或重新定义任何资源行为的灵活性或
在任何库中定义的值。
为了进一步组织您的代码,您的应用程序可以添加对
多个库项目,然后指定的相对优先级
每个图书馆的资源。这使您可以建立资源
实际在你的应用程序中以累积的方式使用。当两个
从应用程序引用的库定义相同的资源 ID,
工具从具有更高优先级的库中选择资源
并丢弃另一个。
将库项目的引用添加到 Android 后
项目,您可以设置它们的相对优先级。在构建时,
库一次一个地与应用程序合并,从
从最低优先级到最高优先级。
库项目可以引用其他库项目,并且可以导入
以正常方式的外部库(JAR)。 ……”
我在使用库 Rajawali(0.9 版)时遇到了类似的问题。需要分发文件。单个 jar 和应用程序将使用此 JAR 来显示 3D 屏幕。问题是我们的图书馆是使用图书馆资源 Rajawali 的定制。因此创建了两个项目结构(例如库项目)。生成时。由于您上面解释的原因,使用资源的 JAR 应用程序无法运行),这是因为该库使用图像的 Rajawali 功能加载目标应用程序版本中无法识别的 ID。
单个JAR的解决方案可以通过R.raw.X(Android方式)修改代码不使用Rajawali资源去使用文件夹assets/来验证,让组件使用Rajawali AsseptManager 打开资源。解决方案是导出 JAR 文件夹,其中包含内部资产 / 和字节码(.Class)以及我们的 LIB Rajawali。
通过 Fat-JAR Eclipse PlugIn(或 0.0.31 +)[更新站点 http://kuruczgrafika.de/fatjar] 可以生成单个 JAR 并在目标应用程序中使用它。 ANT 脚本用于运行下面的 XML,并生成了一个 JAR 文件。文件“lib3d_NAME_HERE.jar”(.JAR)将在/build/lib3d_NAME_HERE.jar中生成
<?xml version="1.0"?>
<project name="lib3d_NAME_HERE" default="main" basedir=".">
<property name="projectPath" value="D:\Development\lib3d_NAME_HERE"/>
<!-- this file was created by Fat-Jar Eclipse Plug-in -->
<!-- the ANT-Export is in a very early stage, so this -->
<!-- is only experimental, ANT 1.6 or above is -->
<!-- required, feedback is always welcome: -->
<!-- http://sourceforge.net/projects/fjep -->
<!-- uncomment the following lines if using ANT outside Eclipse -->
<!--
<property name="fjepPath" value="reference:file:plugins/net.sf.fjep.fatjar_0.0.31/fatjar.jar"/>
<taskdef name="fatjar.build" classname="net.sf.fjep.anttask.FJBuildTask" classpath="${fjepPath}"/>
<typedef name="fatjar.manifest" classname="net.sf.fjep.anttask.FJManifestType" classpath="${fjepPath}"/>
<typedef name="fatjar.exclude" classname="net.sf.fjep.anttask.FJExcludeType" classpath="${fjepPath}"/>
<typedef name="fatjar.jarsource" classname="net.sf.fjep.anttask.FJJarSourceType" classpath="${fjepPath}"/>
<typedef name="fatjar.filesource" classname="net.sf.fjep.anttask.FJFileSourceType" classpath="${fjepPath}"/>
-->
<!-- uncomment the above lines to use ANT outside of Eclipse -->
<target name="main">
<fatjar.build output="build/lib3d_NAME_HERE.jar">
<fatjar.manifest/>
<fatjar.filesource path="${projectPath}/bin/classes" relpath=""/>
<fatjar.filesource path="${projectPath}/assets/" relpath="assets"/>
</fatjar.build>
</target>
</project>