【问题标题】:How to generate a jar file for a java project and use the jar in an android project如何为java项目生成jar文件并在android项目中使用jar
【发布时间】:2013-10-26 18:37:57
【问题描述】:

我正在尝试为 java 项目生成 jar 文件,然后在 android 项目中引用该 jar 文件。作为测试,我创建了一个仅包含以下类的简单 java 项目

package test;
public class Test {
public static void hello(){
    System.out.println();
}
public static void main(String[] args){
    hello();
}

}

我将此项目导出为 Eclipse 下的可执行 Jar 文件。然后我将此 jar 文件复制到一个 android 项目的“libs”文件夹中,因此 jar 文件出现在私有库中,我选中“订购和导出”选项卡下的私有库框。我通过在android项目的主要活动的onCreate()中添加以下语句来引用jar文件

  Test.hello(); //reference the jar file

但是,当我运行 Android 项目时,我得到了

java.lang.NoClassDefFoundError: test.Test

错误。完整的错误跟踪跟踪如下

 10-17 23:14:52.976: E/AndroidRuntime(16725): FATAL EXCEPTION: main
 10-17 23:14:52.976: E/AndroidRuntime(16725): java.lang.NoClassDefFoundError: test.Test
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at      
  com.skyhookwireless.samples.wpsapitest.WpsApiTest.onCreate(WpsApiTest.java:71)
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at    
  android.app.Activity.performCreate(Activity.java:4470)
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at 
 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at 
 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at 
 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at 
 android.app.ActivityThread.access$600(ActivityThread.java:128)
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at 
 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at 
 android.os.Handler.dispatchMessage(Handler.java:99)
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at 
  android.os.Looper.loop(Looper.java:137)
  10-17 23:14:52.976: E/AndroidRuntime(16725):  at     
   android.app.ActivityThread.main(ActivityThread.java:4517)
    10-17 23:14:52.976: E/AndroidRuntime(16725):    at  
    java.lang.reflect.Method.invokeNative(Native Method)
   10-17 23:14:52.976: E/AndroidRuntime(16725):     at 
  java.lang.reflect.Method.invoke(Method.java:511)
  10-17 23:14:52.976: E/AndroidRuntime(16725):  at          
  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
  10-17 23:14:52.976: E/AndroidRuntime(16725):  at  
  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
 10-17 23:14:52.976: E/AndroidRuntime(16725):   at    
    dalvik.system.NativeStart.main(Native Method)

附上订单和导出选项卡的截图以及每个库中包含的jar。

有谁知道我该如何纠正这个问题?

我已阅读此站点上有关 NoClassDefFoundError 的几篇帖子(例如 this),并尝试了 cmets 或答案中列出的解决方案。但是在这个简单的场景中没有人能解决我的问题。

【问题讨论】:

  • 你关注了android documentation这个话题吗?我使用这些指南没有问题。
  • 你能发布完整的堆栈跟踪吗?
  • 我已阅读您链接的文章。但它只讲了android库项目,并没有提到如何将java项目制作为库,是吗?
  • 你能分享一下Java Build Path>Order and Export的截图吗?您是否尝试过检查 Android 依赖项?
  • 试图将 gen 放在 src 之前,没有帮助

标签: java android eclipse jar


【解决方案1】:

我觉得您的项目和测试类的主要活动是由单独的类加载器加载的。看看这个,找出你可能错过的地方。

http://javareferencegv.blogspot.com/2013/10/debugging-javalangnoclassdeffounderror.html

【讨论】:

  • 不错的文章,但对我手头的问题仍然没有帮助
  • 将包含 Test 类的 jar 添加到您的类路径并尝试是否有帮助
  • 您是否在堆栈跟踪中看到任何进一步的错误或异常......可能是 ClassNotFoundException 或 ExceptionInInitializerError?
【解决方案2】:

您可以按照以下步骤进行,这是从android库项目中制作jar

$ cd your_project_path
$ android update project -p .
$ ant jar

【讨论】:

    【解决方案3】:

    为什么不将 Java 项目导入 Android 工作区,然后将其用作 Android 项目中的库?这应该可以解决您的问题。

    【讨论】:

    • 我做到了。没有区别
    【解决方案4】:

    我认为 Dalvik VM 不可能运行 Java 字节码。 而且你的 Java JAR 不包含任何 .dex 文件,里面的类也找不到。

    See this answer for info on DEX format

    您可以将 Java JAR 转换为 Android JAR。 或者将您的 Java 源代码添加到您的 Android 项目中,甚至引用与您的 Java 项目相同的源文件...

    【讨论】:

      猜你喜欢
      • 2013-11-26
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2015-12-05
      • 2012-10-11
      • 1970-01-01
      相关资源
      最近更新 更多