簡體   English   中英

包含庫jar時的ClassNotFoundException

[英]ClassNotFoundException when including a library jar

在我的android項目中,我在libs文件夾中添加了一個庫jar。
這個jar包含三個不同的包:

  1. 谷歌GSON(com.google.gson)
  2. jboss netty(org.jboss.netty)
  3. 我自己開發的一個客戶端應用程序,它使用這兩個其他庫。 (com.example.core)

使用ant編譯/存檔jar。

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(甲骨文)

我測試過的設備:
三星Galaxy S2
LG nexus 4

有任何想法嗎? 謝謝。

您將獲得NoClassDefFoundError因為您的jar文件在運行時不可用。

為了使它在運行時可用,您必須在java構建路徑中檢查jar文件的復選框,如下所示:

在此輸入圖像描述

好吧,我終於找到了問題,我花了一段時間。

我在我的機器上使用java 7,而ant構建器也使用這個默認版本,不幸的是,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" 

希望這會為面臨這個問題的其他人節省一些時間。

(java構建路徑/順序和導出)將您的lib移到頂部並簽入

對於IntelliJ,這個設置終於讓錯誤消失了:

在此輸入圖像描述

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM