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

Java 如何创建一个可被多个Android项目重用的类的jar文件?,java,android,eclipse,noclassdeffounderror,Java,Android,Eclipse,Noclassdeffounderror,以下是我迄今为止一直遵循的步骤,运气不佳。我对Java项目非常陌生,所以我怀疑我可能遗漏了一些明显的东西 使用Eclipse,我创建了一个名为TestSDK的简单Java项目,在该项目中创建了一个名为com.test.TestSDK的包,并在该包中创建了以下类: package com.test.testsdk; public class TestClass { public void TestMethod() { } } 这样编译时不会出现错误或警告 然后,我使用Eclips

以下是我迄今为止一直遵循的步骤,运气不佳。我对Java项目非常陌生,所以我怀疑我可能遗漏了一些明显的东西

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

package com.test.testsdk;
public class TestClass {
    public void TestMethod() {
    }
}
这样编译时不会出现错误或警告

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

然后,我从向导列表中的文件->新建->项目创建一个新的Android应用程序项目。这在Android emulator和我的测试设备上编译和运行时没有警告或错误(我收到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
在web上搜索
NoClassDefFoundError
会得到很多关于如何导入JAR文件以确保类路径正确的建议。因此,我尝试了以下所有导入JAR文件的方法:

  • “添加外部JAR…”从项目属性中Java Build Path的Libraries选项卡,然后在Order和Export选项卡中检查(或不检查,我尝试了两者)JAR。还尝试将JAR移动到订单和导出列表的顶部,这没有什么区别

  • 在项目中创建一个“libs”文件夹,并在其中添加JAR。我确认JAR也被添加到项目列表中的“Android依赖项”中。还尝试右键单击JAR文件并选择BuildPath->AddtoBuildPath,这没有什么区别

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

  • 我随后下载了其他第三方SDK,这些SDK打包为JAR文件,并包含在同一个Android应用程序项目中,使用上述3种方法中的任何一种都可以很好地工作(我能够从这些SDK实例化类并使用它们而不会出错),这让我相信我在TestSDK项目和/或类中遗漏了一些东西或做了一些错误,从而阻止了它在Android应用程序项目中的使用


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

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


    我建议您创建一个干净的项目,创建测试活动,创建
    libs/
    文件夹,将JAR复制到
    libs/
    文件夹中,将代码复制到JAR的API中,编译并运行。如果这是可行的,那么你原来的项目仍然有你以前的努力留下的让你悲伤的东西。如果失败了,那么就会发生一些相当奇怪的事情。JAR本身可能很好,否则会出现编译错误。

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


    我建议您创建一个干净的项目,创建测试活动,创建
    libs/
    文件夹,将JAR复制到
    libs/
    文件夹中,将代码复制到JAR的API中,编译并运行。如果这是可行的,那么你原来的项目仍然有你以前的努力留下的让你悲伤的东西。如果失败了,那么就会发生一些相当奇怪的事情。JAR本身可能很好,否则会出现编译错误。

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

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

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

    这样做之后,导出JAR并将其导入到Android项目的libs目录中,我现在能够实例化TestSDK类,并在没有NoClassDefFoundError异常的情况下很好地使用它们


    最好的猜测是,Android应用程序是根据比我的TestSDK类(我相信是针对JavaSE-1.7的)更旧的JRE版本编译的,这导致了问题。将两个版本匹配起来就解决了这个问题。

    我想我找到了问题所在(或者至少找到了解决问题的方法,我仍然无法100%确定我做了什么)--

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

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

    完成此操作后,导出JAR