2

我一直在构建一个自定义 Java 库,在将其导入我的 Android 项目后,java.lang.NoClassDefFoundError当我尝试使用它时,它会导致一个结果。

我的库曾经是我项目的一部分,但我决定“拆分”它,并创建一个 Java 库。它导入了一些工作所需的库(org.json ...),并且有两个包。

要将它包含到我的 Android 项目中,我只是将我的库复制/粘贴到libs我的 Android 项目的文件夹中,Eclipse 会检测到它,并且不会在我的代码中显示任何错误,并且该库似乎已添加到“ Android 依赖项”文件夹。但是,当我运行该项目时,我需要我的库的第一行中有一个 java.lang.NoClassDefFoundError 异常。

如果你们中的一个人可以帮助我解决这个问题,我将不胜感激。我什至看不到我做错了什么...

编辑:您可以在这里找到我正在使用的 jar:https ://docs.google.com/file/d/0B1rK0R07j--QZmJFMUpLVEdMNnc/edit?usp=sharing和来源https://github.com/MagicMicky /习惯RPGJavaAPI

注意:该库似乎适用于普通的 Java 项目。

我的LOGCAT如下:

05-21 00:27:59.349: E/AndroidRuntime(11797): FATAL EXCEPTION: main
05-21 00:27:59.349: E/AndroidRuntime(11797): java.lang.NoClassDefFoundError: com.magicmicky.habitrpgmobileapp.MainActivity$1
05-21 00:27:59.349: E/AndroidRuntime(11797):    at com.magicmicky.habitrpgmobileapp.MainActivity.<init>(MainActivity.java:44)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at java.lang.Class.newInstanceImpl(Native Method)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at java.lang.Class.newInstance(Class.java:1319)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at android.os.Looper.loop(Looper.java:137)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at android.app.ActivityThread.main(ActivityThread.java:5041)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at java.lang.reflect.Method.invokeNative(Native Method)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at java.lang.reflect.Method.invoke(Method.java:511)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-21 00:27:59.349: E/AndroidRuntime(11797):    at dalvik.system.NativeStart.main(Native Method)

MainActivity.java:44 是我使用库的第一行...

Edit2:这是我的 Android 项目的第一行:

包 com.magicmicky.habitrpgmobileapp;

import java.util.ArrayList;
import java.util.List;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.magicmicky.habitrpgmobileapp.habits.HabitItem;
import com.magicmicky.habitrpgmobileapp.habits.User;
import com.magicmicky.habitrpgmobileapp.onlineapi.GetUser;
import com.magicmicky.habitrpgmobileapp.onlineapi.HostConfig;
import com.magicmicky.habitrpgmobileapp.onlineapi.OnHabitsAPIResult;
import com.magicmicky.habitrpgmobileapp.onlineapi.WebServiceInteraction.Answer;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends SherlockFragmentActivity {
    MyPagerAdapter fgsAdapter;
    private TextView username_TV;
    /* Other decarations...*/
    private User user;//Note that this line is from my library, but doesn't throw an exception
    OnHabitsAPIResult callback = new OnHabitsAPIResult() { // And this is line 44...
        Handler mainHandler;
        private int nbRequests=0;
        @Override
        public void onUserReceived(final User us) {
            mainHandler = new Handler(getMainLooper());
            Runnable myRunnable = new Runnable(){
                public void run() {
                    user=us;
                    notifyDataChanged();
                    afterResults();
                }
            };
            mainHandler.post(myRunnable);
        }
    };
    /* And code continues...*/

请注意,如果我将库文件复制/粘贴到项目中(而不是导入 jar 库),则此代码运行良好...

4

4 回答 4

2

根据您的问题,我猜您实际上正在使用 Android 库项目(因为您拆分的部分最初是您的 Android 项目的一部分)。因此,您应该查看有关 Android 库项目的文档

基本上:

  1. 它们的行为与其他 Java 库不同
  2. 它们也需要以不同的方式包含在内

在Eclipse中纠正此问题的最佳方法:

  1. 在其项目属性中将您的库项目标记为 Android 库(右键单击您的项目->Android
  2. 以相同的方式添加项目的依赖项(右键单击您的项目->Android->添加库
于 2013-05-20T22:03:14.857 回答
1

好的,问题解决了……

这显然是因为当我将 Java 库导出到 .jar 文件时,我为应用程序使用了特定的合规级别。一旦我取消选中(右键单击库项目) -> 属性 -> Java 编译器 -> “启用项目特定编译器”下的框,一切正常。Android 项目没有使用任何项目特定的编译器。

希望它可以帮助某人...

于 2013-05-21T18:21:53.950 回答
0

如果没有库或您的 android 项目进行测试,有很多可能的原因。

我的建议如下:

  1. 从您的 Android 项目中删除该库。
  2. 右键单击项目并转到 Build-Path->Add External Archives
  3. 在弹出的窗口中导航到您的图书馆所在的位置并选择它。

我之前看到过将库复制/粘贴或拖动到项目中的问题。如果这无法解决您的问题,请随时详细说明更多信息,我会尽力帮助您解决这个问题。

于 2013-05-20T19:47:11.393 回答
0

我尝试了@MagicMicky 的解决方案,但这导致了其他错误,例如一些错误,编译器合规性级别不匹配。但是,以下步骤为我解决了问题,

项目属性 > Java 构建路径 > 订购和导出选项卡 > 检查您已导入的 jar 包并点击确定

于 2014-06-19T16:34:26.153 回答