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

glo*_*glo 12 android facebook jar

当我将项目链接到我已复制到我的项目lib文件夹的facebookSDK jar文件时,我得到java.lang.NoClassDefFoundError:com.facebook.android.R $布局错误,而不是将我的项目链接到我工作区中的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
Run Code Online (Sandbox Code Playgroud)

Fra*_*yen 8

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

有两个解决方案:

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

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


dd6*_*619 2

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

NoClassDefFoundError appears only when it fails to find .class file of java class.

as the class file is not present you cant access any function or variable from that class.

To solve this issue,

n eclipse when you export the jar file it includes only the classes which don't have any errors or warnings.So, to generate jar file with all the classes including warnings you need to select generate Jar with warnings.

Then put this jar file in libs folder instead of lib folder.

Then add this jar to your build path.

As you want to import the resources,

Since Android makes R class automatically with resources files under /res folder, using R class as final static is impossible.

in your source code which will be exported in jar file, DON'T USE R variable because it will be replaced with final static memory address in compile time. Instead of using R, use method below.

 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;

    }
Run Code Online (Sandbox Code Playgroud)

For example, if you have a layout named "main.xml", you can get it by calling method

int id = getResourceIdByName(context.getPackageName(), "layout", "main");
Run Code Online (Sandbox Code Playgroud)

and if you have a string whose id is "text1", you can get it by calling method

int id = getResourceIdByName(context.getPackageName(), "string", "text1");
Run Code Online (Sandbox Code Playgroud)

this method gives you your resource id in runtime. It uses reflection api to get R's status in runtime.

So now you can avoid using R variable and resources ewrrors by using this method

copy your res to target project.

And finally run your project.