Java.lang.NoClassDefFoundError: ошибка com.facebook.android.R $ при использовании facebook sdk jar

Я получаю java.lang.NoClassDefFoundError: com.facebook.android.R $ ошибка компоновки, когда я связываю свой проект с файлом jar facebookSDK, который я скопировал в папку моего проекта lib, вместо того, чтобы связывать мой проект с проектом библиотеки facebookSDK в моей рабочей области. Он отлично работает, когда я ссылаюсь на проект библиотеки в рабочем пространстве.

Может ли кто-нибудь сказать мне, как решить эту проблему. Я использую facebook sdk 3.0 для Android. Заранее спасибо.

EDIT: после создания файла 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 не содержится папка ресурсов в проекте SDK для Facebook.

Для этого есть 2 решения:

  1. Добавьте проект Facebook SDK в качестве библиотеки проекта.

  2. Скопируйте файл Facebook SDK JAR в папку libs текущих проектов и скопируйте все ресурсы из проекта SDK для Facebook в текущий проект.

Это означает, что ваш JAR-файл не имеет всех файлов классов.

NoClassDefFoundError появляется только тогда, когда не удается найти файл .class класса java.

Поскольку файл класса отсутствует, вы не можете получить доступ к какой-либо функции или переменной из этого класса.

Чтобы решить эту проблему,

N eclipse, когда вы экспортируете файл jar, он включает только классы, которые не имеют никаких ошибок или предупреждений. Поэтому для создания файла jar со всеми классами, включая предупреждения, вам нужно выбрать генерацию Jar с предупреждениями .

Затем поместите этот файл jar в папку libs вместо папки lib .

Затем добавьте эту банку в свой путь сборки.

Поскольку вы хотите импортировать ресурсы,

Поскольку Android автоматически создает R-класс с файлами ресурсов в папке / res, использование 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"); 

И если у вас есть строка с идентификатором «text1», вы можете получить ее, вызвав метод

 int id = getResourceIdByName(context.getPackageName(), "string", "text1"); 

Этот метод дает вам идентификатор ресурса во время выполнения. Он использует отражение api для получения статуса R во время выполнения.

Итак, теперь вы можете избежать использования переменных R и ресурсов ewrrors, используя этот метод

Скопируйте свои res в целевой проект.

И, наконец, запустите свой проект.