如何创建可以被多个Android项目重用的类的jar文件?

时间:2012-07-03 22:11:37

标签: java android eclipse noclassdeffounderror

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

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

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

编译时没有错误或警告。

然后我使用Eclipse和标准导出选项将其导出为JAR文件(TestSDK.jar)(导出生成的类文件和资源,压缩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 Build Path的Libraries选项卡中“添加外部JAR ...”,然后在Order and Export选项卡中检查(或不检查,我尝试了两者)JAR。还尝试将JAR移动到Order and Export列表的顶部,这没有任何区别。

  2. 在项目中创建“libs”文件夹,并在那里添加JAR。我确认JAR也被添加到项目列表中的“Android Dependencies”中。还尝试右键单击JAR文件并选择Build Path-> Add to Build Path,这没有任何区别。

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

  4. 我随后下载了打包为JAR文件的其他第三方SDK,并将它们包含在同一个Android应用程序项目中,并且使用上述3种方法中的任何一种都可以正常工作(我能够实例化那些类中的类) SDK并使用它们没有错误),这让我相信我在TestSDK项目和/或类中缺少某些东西或做错了什么,这阻止了它在Android应用程序项目中的使用。

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

2 个答案:

答案 0 :(得分:1)

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

我建议你创建一个干净的项目,创建测试活动,创建libs/文件夹,将JAR复制到libs/文件夹,代码到JAR的API,编译和运行。如果这样可行,那么你原来的项目仍然会因你以前的努力而挥之不去,这会让你感到悲痛。如果它失败了,那么一些相当奇怪的事情正在发生。 JAR本身可能很好,否则你会遇到编译错误。

答案 1 :(得分:0)

我想我弄清楚问题是什么(或至少如何解决问题,我仍然不能100%肯定我的所作所为) -

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

检查新的Android应用程序项目的项目属性,Java Compiler部分将“Compiler compliance level”设置为1.5。所以,我尝试重新创建我的TestSDK项目,但告诉它使用J2SE-1.5作为执行环境而不是defalut jre7。

执行此操作后,导出JAR并将其导入到Android项目的libs目录中,我现在能够实例化TestSDK类并使用它们而没有NoClassDefFoundError异常。

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