2013-07-19 6 views
4

Я создал новый проект с помощью Android Studio и скопировал файл jar в свои приложения. Затем добавили его как библиотеку, которая заставила IDE распознать ее. Позже я добавил его в build.gradle, и теперь он просто компилируется. Однако, когда я пытаюсь запустить приложение на устройстве, он сбрасывается с NoClassDefFoundError.Импорт внешнего файла jar в Android Studio --- NoClassDefFoundError

Прикрепленный и в следующем порядке:

  1. Дерево проекта на Android Studio. Обратите внимание на test-jar-to-import.jar внутри HelloSheepProject/HelloSheep/libs/.
  2. Содержание MainActivity.java. Он пытается создать новый MyFile. Ничего больше.
  3. build.gradle внутри HelloSheepProject/HelloSheep/. Я добавил строку compile files('libs/test-jar-to-import.jar').
  4. Содержание MyFile.java. Он был создан в Eclipse и экспортирован как файл jar.
  5. Ошибка при попытке запустить его на устройстве.

Любые идеи о том, что мне не хватает? Я пробовал ./gradlew clean в HelloSheepProject, но это не помогло.


enter image description here


package top.furrylamb.example.hellosheep; 

import android.os.Bundle; 
import android.app.Activity; 

import top.furrylamb.example.MyFile; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     MyFile myFile = new MyFile("hi", "there"); 
    } 

} 

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.5.+' 
    } 
} 
apply plugin: 'android' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'com.android.support:support-v4:13.0.+' 
    //compile fileTree(dir: "libs", include: "*.jar") 
    compile files('libs/test-jar-to-import.jar') 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 14 
     targetSdkVersion 16 
    } 
} 

package top.furrylamb.example; 

public class MyFile { 
    public final String left; 
    public final String right; 
    public MyFile(String left, String right) { 
     this.left = left; 
     this.right = right; 
    } 
} 

07-19 19:26:33.855 13656-13656/? E/AndroidRuntime: FATAL EXCEPTION: main 
     java.lang.NoClassDefFoundError: top.furrylamb.example.MyFile 
     at top.furrylamb.example.hellosheep.MainActivity.onCreate(MainActivity.java:15) 
     at android.app.Activity.performCreate(Activity.java:5206) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
     at android.app.ActivityThread.access$600(ActivityThread.java:140) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4898) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
     at dalvik.system.NativeStart.main(Native Method) 

ответ

10

Я нашел решение своей проблемы. Поскольку я был потерян на это в течение нескольких часов, я буду держать поток вместо его удаления.

jar Я был импортирован был скомпилирован/экспортирован с Java 7 в виду. Как только я включил совместимость с Java 6, он работал нормально.

Подводя итог, при добавлении внешнего файла банки в Android Studio:

  1. Копировать банку в корневую папку/проект/ЛИЭСА;
  2. Щелкните правой кнопкой мыши и добавьте в качестве библиотеки;
  3. Добавьте банку в root/project/build.gradle (что-то вроде compile files('libs/test-jar-to-import.jar'));
  4. Убедитесь, что импортированная банка соответствует Java 6 (на данный момент 7 не будет выполняться).
+0

Ваше сообщение только что закончилось 3 часа разочарования, в моем случае перетащите «~/sdk/extras/google/gcm/gcm-client/dist/gcm.jar' в новый проект/libs off и следуйте за остальными ваши инструкции. Благодарю. –

+0

Спасибо! Я был в этом часами. Мое приложение Android использует Java 1.8, а моя библиотека классов была установлена ​​в JDK 8. Все скомпилировано, но продолжало получать 'com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command' C: \ Program Files \ Java \ jdk1.8.0_25 \ bin \ java.exe '' закончил с ненулевым значением выхода 1' при попытке запустить приложение. Изменен двоичный формат библиотеки классов для JDK 7 (из свойств проекта Netbeans), и теперь он работает! Еще раз спасибо. – Rachel

0

В моем случае, я получал ту же ошибку NoClassDefFoundError во время выполнения, хотя она скомпилирована в порядке. Раньше он работал хорошо. Но однажды я добавил новый пакет в свое приложение, в результате которого изменилось пространство имен пакетов.Моя банка уже была частью структуры приложения, поэтому я был несколько удивлен этой новой ошибкой во время выполнения, которая вдруг начала жаловаться на неизвестный класс в библиотеке jar, которая работала ранее. Исправление в моем случае было простым проектом Build-> Clean.

Смежные вопросы