包含库jar时发生ClassNotFoundException

2020年11月10日 36点热度 0条评论

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

  • 谷歌GSON(com.google.gson)
  • jboss netty(org.jboss.netty)
  • 我自己开发的客户端应用程序使用了另外两个库。 (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)之外,其他所有内容都已添加到ojit_code目录中。

    因此,我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)

    我测试过的设备:

    三星银河S2

    LG Nexus 4

    有任何想法吗?

    谢谢。

    解决方案如下:

    您收到了NoClassDefFoundError,因为您的jar文件在运行时不可用。

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