java.lang.NoClassDefFoundError: com.facebook.android.使用faceb



我得到java.lang。NoClassDefFoundError: com.facebook.android。R$layout错误,当我链接我的项目到我已经复制到我的项目库文件夹中的facebookSDK jar文件,而不是链接我的项目到我的工作空间中的facebookSDK库项目。当我在工作空间中链接到库项目时,它工作得很好。

谁能告诉我如何解决这个问题?我使用facebook sdk 3.0为android。提前谢谢。

编辑:在生成带有警告的jar文件后,我在我的logcat中得到以下错误

01-17 12:42:04.790: E/AndroidRuntime(3073): FATAL EXCEPTION: main
01-17 12:42:04.790: E/AndroidRuntime(3073): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.games.game/com.facebook.LoginActivity}: android.content.res.Resources$NotFoundException: File 296108030489520 from xml type layout resource ID #0x7f030001
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1816)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.app.ActivityThread.access$1500(ActivityThread.java:132)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1033)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.os.Looper.loop(Looper.java:143)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.app.ActivityThread.main(ActivityThread.java:4196)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at java.lang.reflect.Method.invokeNative(Native Method)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at java.lang.reflect.Method.invoke(Method.java:507)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at dalvik.system.NativeStart.main(Native Method)
01-17 12:42:04.790: E/AndroidRuntime(3073): Caused by: android.content.res.Resources$NotFoundException: File 296108030489520 from xml type layout resource ID #0x7f030001
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.content.res.Resources.loadXmlResourceParser(Resources.java:1934)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.content.res.Resources.loadXmlResourceParser(Resources.java:1889)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.content.res.Resources.getLayout(Resources.java:740)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.view.LayoutInflater.inflate(LayoutInflater.java:318)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:224)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.app.Activity.setContentView(Activity.java:1702)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at com.facebook.LoginActivity.onCreate(LoginActivity.java:55)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780)
01-17 12:42:04.790: E/AndroidRuntime(3073):     ... 11 more
01-17 12:42:04.790: E/AndroidRuntime(3073): Caused by: java.io.FileNotFoundException: 296108030489520
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.content.res.AssetManager.openXmlAssetNative(Native Method)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:524)
01-17 12:42:04.790: E/AndroidRuntime(3073):     at android.content.res.Resources.loadXmlResourceParser(Resources.java:1916)
01-17 12:42:04.790: E/AndroidRuntime(3073):     ... 20 more

这是因为JAR里面没有包含Facebook SDK项目的资源文件夹

有两个解决方案:

  1. 添加Facebook SDK Project作为项目库

  2. 将Facebook SDK JAR文件复制到当前项目文件夹libs ,并将Facebook SDK Project中的所有资源复制到当前项目

这意味着您的JAR文件没有包含所有的类文件。

NoClassDefFoundError仅在查找java类.class文件失败时出现。

由于类文件不存在,所以不能从该类访问任何函数或变量。

要解决这个问题,

在eclipse中导出jar文件时,它只包含没有任何错误或警告的类。因此,要生成包含所有类(包括警告)的jar文件,您需要选择generate jar with warnings

然后把这个jar文件放在lib文件夹中,而不是lib文件夹中。

然后将此jar添加到您的构建路径。

当您想要导入资源时,

由于Android自动使用/res文件夹下的资源文件生成R类,因此不可能使用R类作为最终静态。

不要使用R变量,因为它会在编译时被最终的静态内存地址所取代。不使用R,使用下面的方法。
 public static int getResourseIdByName(String packageName, String className, String name) {
       Class r = null;
       int id = 0;
    try {
        r = Class.forName(packageName + ".R");
        Class[] classes = r.getClasses();
        Class desireClass = null;
        for (int i = 0; i < classes.length; i++) {
            if(classes[i].getName().split("\$")[1].equals(className)) {
                desireClass = classes[i];
                break;
            }
        }
        if(desireClass != null)
            id = desireClass.getField(name).getInt(desireClass);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
    return id;
    }

例如,如果你有一个名为"main.xml"的布局,你可以通过调用

方法来获得它
int id = getResourceIdByName(context.getPackageName(), "layout", "main");

如果你有一个id为"text1"的字符串,你可以通过调用

方法来获取它
int id = getResourceIdByName(context.getPackageName(), "string", "text1");

此方法在运行时为您提供资源id。它使用反射api在运行时获取R的状态。

所以现在你可以避免使用R变量和资源错误,通过使用这个方法

复制你的res到目标项目。

最后运行你的项目

最新更新