使用facebook sdk jar时java.lang.NoClassDefFoundError:com.facebook.android.R $布局错误

时间:2013-01-17 05:58:39

标签: android facebook jar

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

有谁能告诉我如何解决这个问题。我正在使用facebook sdk 3.0 for 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

2 个答案:

答案 0 :(得分:8)

这是因为JAR内部不包含Facebook SDK Project的资源文件夹。

有两个解决方案:

  1. 将Facebook SDK Project添加为项目库。

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

答案 1 :(得分:2)

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

NoClassDefFoundError 仅在找不到java类的 .class 文件时出现。

由于类文件不存在,您无法访问该类中的任何函数或变量。

要解决此问题,

当你导出jar文件时,它只包含没有任何错误或警告的类。因此,生成包含所有类的jar文件,包括需要选择的警告生成带警告的jar < /强>

然后将此jar文件放在 libs 文件夹中,而不是 lib 文件夹中。

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

如您要导入资源,

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

在您的源代码中

将在jar文件中导出,请勿使用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变量和资源ewrrors

将您的资源复制到目标项目。

最后运行你的项目。