当我将项目链接到已复制到我的项目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
答案 0 :(得分:8)
这是因为JAR内部不包含Facebook SDK Project的资源文件夹。
有两个解决方案:
将Facebook SDK Project添加为项目库。
将文件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
将您的资源复制到目标项目。
最后运行你的项目。