6

在我的 android 项目中,我在libs文件夹中添加了一个库 jar。
这个 jar 包含三个不同的包:

  1. 谷歌 GSON (com.google.gson)
  2. jboss 网络 (org.jboss.netty)
  3. 我自己开发的一个客户端应用程序使用这两个其他库。(com.example.core)

jar 使用 ant 编译/存档。

eclipse 中没有错误,但是当我尝试在设备上运行我的 android 应用程序时,我得到了这个:

E/AndroidRuntime(23807): FATAL EXCEPTION: main
E/AndroidRuntime(23807): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.project/com.example.project.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.example.project.MainActivity" on path: /data/app/com.example.project-1.apk
E/AndroidRuntime(23807):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
E/AndroidRuntime(23807):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
E/AndroidRuntime(23807):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
E/AndroidRuntime(23807):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
E/AndroidRuntime(23807):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(23807):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(23807):    at android.app.ActivityThread.main(ActivityThread.java:5039)
E/AndroidRuntime(23807):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(23807):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(23807):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime(23807):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime(23807):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(23807): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.project.MainActivity" on path: /data/app/com.example.project-1.apk
E/AndroidRuntime(23807):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
E/AndroidRuntime(23807):    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
E/AndroidRuntime(23807):    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
E/AndroidRuntime(23807):    at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
E/AndroidRuntime(23807):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
E/AndroidRuntime(23807):    ... 11 more

这绝对是我的 jar 造成的,因为如果我从 MainActivity 中删除对它的类的引用,那么问题就解决了,应用程序在设备上运行。

使用apktool我检查了进入 apk 的内容,我发现所有内容都被添加到smali目录中,即除了我的包(com.example.core)之外的所有内容。
所以我的 jar 中的所有 android 应用程序类 (com.example.project)、gson (com.google.gson) 和 netty (org.jboss.netty) 都在那里,但 com.example.core 不存在。

我的环境:
Eclipse 4.2.1
ADT 21.0.1
Java 7(oracle)

我测试过的设备:
三星galaxy S2
LG nexus 4

有任何想法吗?谢谢。

4

4 回答 4

10

你得到一个NoClassDefFoundError因为你的 jar 文件在运行时不可用。

为了让它在运行时可用,您必须在 java 构建路径中检查 jar 文件上的复选框,如下所示:

在此处输入图像描述

于 2013-01-31T12:17:05.847 回答
7

好的,我终于找到了问题,花了我一段时间。

我在我的机器上使用 java 7,ant builder 也使用这个默认版本,不幸的是,android 不喜欢 java 7,所以这解决了我的问题:

<javac srcdir="." destdir="bin/classes" source="1.6" target="1.6">
    ...
</java>

或者您可以在 Eclipse 中使用这些步骤:

Eclipse menu: Window/Preferences/Java/Compiler
Compiler Compliance level: 1.6 
tick "use default" 

希望这将为面临此问题的其他人节省一些时间。

于 2013-02-03T10:41:44.113 回答
3

(java构建路径/顺序和导出)将你的lib移到顶部并签入

于 2013-01-31T12:15:12.637 回答
1

对于 IntelliJ,这个设置最终让我的错误消失了:

在此处输入图像描述

在此处输入图像描述

于 2014-04-24T09:24:19.827 回答