【问题标题】:How do you create a jar file of classes that can be re-used by multiple Android projects?如何创建可以被多个 Android 项目重用的类的 jar 文件?
【发布时间】:2012-07-03 22:11:37
【问题描述】:

这是我到目前为止所遵循的步骤,但没有运气。我对 Java 项目非常陌生,所以我怀疑我可能遗漏了一些明显的东西。

使用 Eclipse,我创建了一个名为 TestSDK 的简单 Java 项目,在其中创建了一个名为 com.test.testsdk 的包,并在其中创建了以下类:

package com.test.testsdk;
public class TestClass {
    public void TestMethod() {
    }
}

编译时没有错误或警告。

然后我使用 Eclipse 和标准导出选项(导出生成的类文件和资源、压缩 JAR 的内容、生成清单文件)将其导出为 JAR 文件 (TestSDK.jar)。我已经尝试过密封和不密封 JAR,这没有区别。

然后我从向导列表中的 File->New->Project 创建一个新的 Android 应用程序项目。这会在 Android 模拟器和我的测试设备上编译并运行而不会出现警告或错误(我收到 hello world 消息)。

然后我添加对我的 TestSDK.jar 文件的引用(使用各种不同的方法,我将在稍后进行扩展),将它导入到主要(也是唯一的)Android 活动中,并尝试实例化我的 TestClass 并调用 TestMethod就可以了,像这样:

package com.apptest.mobilesdktestapp;

import android.app.Activity;
import android.os.Bundle;

import com.test.testsdk.TestClass;

public class MobileSDKTestAppActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TestClass test = new TestClass();
        test.TestMethod();
    }
}

这编译得很好,没有警告或错误。但是,当尝试在模拟器或设备上运行它时,我的 LogCat 窗口中出现以下错误:

AndroidRuntime    Uncaught handler: thread main exiting due to uncaught exception
AndroidRuntime    java.lang.NoClassDefFoundError: com.test.testsdk.TestClass

在网上搜索NoClassDefFoundError 会得到很多关于如何导入 JAR 文件以确保类路径正确的建议。因此,我尝试了以下所有导入 JAR 文件的方法:

  1. 在项目属性的 Java 构建路径的库选项卡中“添加外部 JAR...”,然后在“订单”和“导出”选项卡中检查(或不检查,我都尝试了)JAR。还尝试将 JAR 移到 Order and Export 列表的顶部,这没有任何区别。

  2. 在项目中创建一个“libs”文件夹,并在其中添加 JAR。我确认 JAR 然后也被添加到项目列表中的“Android Dependencies”中。还尝试右键单击 JAR 文件并选择构建路径->添加到构建路径,这没有任何区别。

  3. 将 JAR 移动到我的 Android 应用程序项目目录并执行“添加 JAR...”而不是步骤 1 中的外部 JAR,以及是否导出的所有排列并将其移动到订单列表的顶部与否。

我随后下载了其他 3rd 方 SDK,这些 SDK 打包为 JAR 文件并将它们包含在同一个 Android 应用程序项目中,并且使用上述 3 种方法中的任何一种都可以正常工作(我能够从这些方法中实例化类) SDK 并正确使用它们),这让我相信我在我的 TestSDK 项目和/或类中遗漏了一些东西或做错了一些事情,这阻止了它在 Android 应用程序项目中的使用。

正如我所说,我对 Java 很陌生,所以我希望它是我忽略的一些简单的东西。任何帮助或指导将不胜感激。

【问题讨论】:

    标签: java android eclipse noclassdeffounderror


    【解决方案1】:

    如果你使用的是R17或更高版本的Android工具和Eclipse中的ADT,那么#2的第一句是正确答案;您问题中列出的所有其他内容充其量是不必要的,或者最坏的情况是有害的。

    我建议您创建一个干净的项目,创建测试活动,创建 libs/ 文件夹,将 JAR 复制到 libs/ 文件夹,将代码写入 JAR 的 API,编译并运行。如果这行得通,那么你的原始项目仍然有你之前努力的东西挥之不去,这让你感到悲伤。如果它失败了,那么就会发生一些相当奇怪的事情。 JAR 本身应该没问题,否则会出现编译错误。

    【讨论】:

    • 我试了一下,废弃了旧项目并创建了一个新项目。我刚刚更新到 R20 的工具,它看起来像是在一个新项目中为我生成了 libs 目录。我从干净项目中采取的唯一额外步骤是将 TestSDK jar 导入 libs 目录,并添加 1 行代码来实例化 TestClass... 再次编译良好,但运行时我仍然得到相同的 NoClassDefFoundError。
    • @Rudism:你有没有机会把你的项目贴在某个地方让我看看?
    【解决方案2】:

    我想我知道问题出在哪里(或者至少如何解决这个问题,我仍然不能 100% 确定我做了什么)--

    当我创建原始 TestSDK java 项目时,我让它在项目创建对话框 (jre7) 中以默认 JRE 为目标。

    检查新 Android 应用程序项目的项目属性时,Java 编译器部分的“编译器合规性级别”设置为 1.5。所以,我再次尝试重新创建我的 TestSDK 项目,但告诉它使用 J2SE-1.5 作为执行环境,而不是默认的 jre7。

    完成此操作后,导出 JAR 并将其导入 Android 项目的 libs 目录,我现在可以实例化 TestSDK 类并正常使用它们,而不会出现 NoClassDefFoundError 异常。

    最好的猜测是,Android 应用程序是针对旧版本的 JRE 编译的,而不是我的 TestSDK 类(我相信它的目标是 JavaSE-1.7),导致了这些问题。匹配两个版本就解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多