【问题标题】:How to add external jar libraries to an android project from the command line如何从命令行将外部 jar 库添加到 android 项目
【发布时间】:2011-03-14 03:46:27
【问题描述】:

我正在尝试构建一个具有一些依赖项的 Android 项目。 jar 文件位于 lib/ 目录中。我可以通过将这些 jar 文件添加到我的类路径来构建项目,但当然它会在模拟器中强制关闭,因为这些库不存在。

我正在使用 ant 从命令行执行此操作(not 在 eclipse 中)。我怎样才能让它在命令行中将这些库包含在 apk 中?

【问题讨论】:

    标签: android ant jar


    【解决方案1】:

    在编译时这样做:

    javac -encoding ascii -target 1.5 -d bin/classes \
    -bootclasspath $SDKDIR/android.jar src/some/project/* -classpath=libs/*.jar
    

    并且,当您为 Dalvik 生成字节码时:

    dx --dex --output=bin/classes.dex bin/classes libs/*.jar
    

    另外,在打包 APK 文件时:

    apkbuilder bin/something.apk -z bin/projectname.ap_ \
    -f bin/classes.dex -rf src -rj libs
    

    我假设您使用的是 Linux...在 Windows 上几乎是一样的。

    【讨论】:

      【解决方案2】:

      回答我自己的问题:

      我创建了一个文件“build.properties”并添加了这一行

      external.libs.dir=lib
      

      这是一个幸运的猜测,真的。

      【讨论】:

      • 当我这样做时,ant 会创建一个“libs”目录。如果我把罐子放在里面,它会起作用。不幸的是,我需要使用“lib”,因为每个人都在 Eclipse 中配置了“lib”。而且这个解决方案对我不起作用:-/
      • 但是,如果我需要从单独的文件夹中添加两个库?我需要做什么?
      【解决方案3】:

      在撰写本文时,Jay K 的回答是正确的,但现在 SDK 发生了变化,这是新的方法:

      将以下行添加到ant.properties

      jar.libs.dir=lib
      

      经过测试,可在 external.libs.dir 不工作的地方工作。
      这改变了in December 2010,然后在 2011 年 10 月再次改变。

      【讨论】:

      • 如何声明多个目录?什么是分隔符?
      • 没有。它是“jar.libs.dir”而不是“jar.libs.dirs”。您只能指定一个目录。但在该目录中,您可以根据需要链接到任意数量的 jar。
      【解决方案4】:
      external.libs.dir=lib
      

      在搜索此答案 2 小时后,这对我有用。我的 libs 目录中的 jar 文件最终编译并与 APK 捆绑在一起。

      【讨论】:

        【解决方案5】:

        如果您将库存储在 ${basedir}/libs 中,则 ant 脚本将能够找到它们。

        我查看了当前的 ant 脚本 ( ${sdk.dir}/tools/ant/build.xml ),它将 jar.libs.dir 定义为“libs”。

        仅供参考,ant 脚本有很好的文档记录,因此很容易追踪。

        如果您移动库,请务必编辑您的 .classpath 文件,以防止 Eclipse 用户遭受不必要的痛苦。

        【讨论】:

          【解决方案6】:

          将 jars 放入${YOUR_PROJECT}/libs 目录

          【讨论】:

            【解决方案7】:

            jar.libs.dir 属性是一个单个 目录。它不像是冒号/分号分隔列表的 CLASSPATH。在 jar.libs.dir 中有多个目录的方法是不直接设置它;让它默认为 libs 并转到 libs 并创建所需的软链接到您需要的 .jar 文件。

            【讨论】:

              【解决方案8】:

              仅供参考: 现在 SDK 中有一个错误会阻止使用 jar.libs.dir: http://code.google.com/p/android/issues/detail?id=33194

              再次使用 jar.libs.dir 的简单解决方案(在等待错误修复时)是在 build.xml 文件中添加此目标:

              <target name="-pre-compile">
                  <path id="project.all.jars.path">
                      <path path="${toString:project.all.jars.path}"/>
                      <fileset dir="${jar.libs.dir}">
                          <include name="*.jar"/>
                      </fileset>
                  </path>
              </target>
              

              【讨论】:

              • 您不能像示例中那样覆盖 project.all.jars.path。这将在 ant 构建过程中导致空指针异常,因为您正在重新定义 project.all.jars.path 以便 ${toString:project.all.jars.path} 将评估为空。正确的方法是引入一个 temp.jars.path,在其中包含新的 jars 目录,然后用 temp.jars.path 覆盖 project.all.jars.path
              【解决方案9】:

              上面的例子并不完全正确。您不能覆盖 project.all.jars.path 内联。以下是一个工作示例:

              <target name="-pre-compile">
              <!-- HACK to add the android-support-v4.jar to the classpath directly from the SDK -->
              
                  <echo>ORIGINAL jars.path : ${toString:project.all.jars.path}</echo>
                  <path id="project.all.jars.path.hacked">
                          <path path="${toString:project.all.jars.path}"/>
                          <path path="${sdk.dir}/extras/android/support/v4/android-support-v4.jar"/>
                  </path>
              
                  <path id="project.all.jars.path">
                          <path path="${toString:project.all.jars.path.hacked}"/>
                  </path>
                  <echo>HACKED jars.path : ${toString:project.all.jars.path}</echo>
              
              </target>
              

              【讨论】:

                猜你喜欢
                • 2012-05-03
                • 1970-01-01
                • 2013-09-02
                • 1970-01-01
                • 2015-12-14
                • 1970-01-01
                • 1970-01-01
                • 2011-02-06
                • 1970-01-01
                相关资源
                最近更新 更多