繁体   English   中英

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

[英]How do you create a jar file of classes that can be re-used by multiple Android projects?

这是我到目前为止所遵循的步骤,没有运气。 我对Java项目非常陌生,因此我怀疑我可能缺少明显的东西。

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

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

编译时不会出现错误或警告。

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

然后,我从向导列表中的文件->新建->项目创建一个新的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

在Web上搜索NoClassDefFoundError会产生许多有关如何导入JAR文件以使类路径正确的建议。 结果,我尝试了以下所有导入JAR文件的方法:

  1. 在项目属性中的Java Build Path的Libraries选项卡中,“添加外部JAR ...”,然后在Order and Export选项卡中检查(或不检查,我同时尝试了)JAR。 还尝试将JAR移至“订购和出口”列表的顶部,这没有什么区别。

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

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

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

就像我说的那样,我对Java还是很陌生,所以我希望它被我忽略了。 任何帮助或指导,将不胜感激。

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

我建议您创建一个干净的项目,创建测试活动,创建libs/文件夹,将JAR复制到libs/文件夹中,将代码复制到JAR的API中,进行编译并运行。 如果这行得通,那么您以前的工作仍然会在您以前的工作中留下很多困扰您的东西。 如果失败,则说明发生了相当奇怪的事情。 JAR本身可能很好,否则您将得到编译错误。

我想我知道了问题所在(或者至少是解决问题的方法,但我仍然不确定100%做到了)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM