Подтвердить что ты не робот

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

Я получаю сообщение java.lang.NoClassDefFoundError: com.facebook.android.R $layout при подключении моего проекта к файлу 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
4b9b3361

Ответ 1

Это потому, что внутри JAR не содержится папка ресурсов в проекте SDK для Facebook.

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

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

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

Ответ 2

Это означает, что ваш 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 с помощью этого метода

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

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