2016-04-28 11 views
1

Ich habe Probleme, wenn ich versuche, eine Bibliothek zu erstellen, die eine andere in Android Studio enthält. Zuerst benutze ich Android Studio 2.0 und Unity 5.3.4f1. Ich möchte FFMpeg in Unity integrieren, also entschloss ich mich, eine eigene Bibliothek zu erstellen, die die FFMpeg-Bibliothek als Vermittler verwendet. Die FFMpeg-Bibliothek ist here.java.lang.NoClassDefFoundError Android Studio Unity

zu starten ich ein neues leeres Projekt in Android Studio erstellt und in der es schaffte ein neues Modul, das meine Bibliothek sein, Neu-> Module-> Android-Bibliothek und nannte es „ffmpegcodec“ verwenden. Danach öffnete ich build.gradle Datei in dem neuen Modul-Ordner und Paste:

compile 'com.writingminds:FFmpegAndroid:0.3.2' 

innerhalb Abhängigkeiten Klammern, und klicken Sie auf Sync (Es sind keine Störungen aufwiesen).

Danach eine neue Java-Klasse innerhalb src/main/java/erstellen Paketname/ und es FFMpegCodec benannt. Innerhalb dieser Paste dieser Code:

public class FFMpegCodec { 
private static FFmpeg ffmpeg; 
private static Context context; 
private static FFMpegCodec INSTANCE = null; 

public FFMpegCodec(){ 
    INSTANCE = this; 
} 

public static FFMpegCodec instance(){ 
    if(INSTANCE == null){ 
     INSTANCE = new FFMpegCodec(); 
    } 
    return INSTANCE; 
} 

public void setContext(Context ctx){ 
    this.context = ctx; 
} 

public void loadFFMpegBinary() { 
    try { 
     if (ffmpeg == null) { 

      ffmpeg = FFmpeg.getInstance(context); 
     } 
     ffmpeg.loadBinary(new LoadBinaryResponseHandler() { 
      @Override 
      public void onFailure() { 
       Log.e("FFMPEG", "ffmpeg : NOT correct Loaded"); 
      } 

      @Override 
      public void onSuccess() { 
       Log.e("FFMPEG", "ffmpeg : correct Loaded"); 
      } 
     }); 
    } catch (FFmpegNotSupportedException e) { 

    } catch (Exception e) { 

    } 
} 

public void execFFmpegCommand(final String[] command) { 
    try { 
     ffmpeg.execute(command, new ExecuteBinaryResponseHandler() { 
      @Override 
      public void onFailure(String s) { 
       Log.e("FFMPEG", "FAILED with output : " + s); 
      } 

      @Override 
      public void onSuccess(String s) { 
       Log.e("FFMPEG", "SUCCESS with output : " + s); 
      } 

      @Override 
      public void onProgress(String s) { 
       Log.e("FFMPEG", "Started command : ffmpeg " + command); 
       Log.e("FFMPEG", "progress : " + s); 
      } 

      @Override 
      public void onStart() { 
       Log.e("FFMPEG", "Started command : ffmpeg " + command); 

      } 

      @Override 
      public void onFinish() { 
       Log.e("FFMPEG", "Finished command : ffmpeg " + command); 

      } 
     }); 
    } catch (FFmpegCommandAlreadyRunningException e) { 
     // do nothing for now 
    } 
} 

Es im Grunde eine Instanz von FFmpeg und macht Anrufe von ffmpeg Befehle erzeugt.

Sobald ich meine lib getan haben, habe ich beschlossen, es in meinem Projekt zu testen, damit ich meine lib in meiner app graddle verwenden, umfassen:

compile project(':ffmpegcodec') 

Danach habe ich fügen Sie einfach diesen Code zu meinem MainActivity:

public class MainActivity extends AppCompatActivity { 

FFMpegCodec ffmpeg; 

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

    Button execCommandButton = (Button) findViewById(R.id.execCommandButton); 

    ffmpeg = FFMpegCodec.instance(); 


    execCommandButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getApplicationContext(), "This is a Toast!!", Toast.LENGTH_SHORT).show(); 
      ffmpeg.setContext(MainActivity.this); 
      ffmpeg.loadFFMpegBinary(); 
      String []cmd = new String[1]; 
      cmd[0] = "-version"; 
      ffmpeg.execFFmpegCommand(cmd); 
     } 
    }); 

} 

Danach laufe ich mein Projekt und wenn ich den Knopf drücke, gibt es zurück, dass alles in Ordnung ist, zeigt ffmpeg Version. Sobald ich überprüfen, dass meine lib arbeitet, entscheide ich, es zu Unity zu verschieben, kopieren Sie die ffmpegcodec-realese.arr Datei innerhalb ffmpegcodec/build/outputs/aar Ordner und fügen Sie es in mein Unity-Projekt. Dann schrieb ich ein C# -Skript, um meine lib zu verwenden, die dieses enthält:

Die Probleme kommen hier. Wenn ich eine Klasseninstanz mit:

AndroidJavaClass captureClass = new AndroidJavaClass ("com.promineostudios.ffmpegcodec.FFMpegCodec"); 

Es eine Instanz erstellt richtig, und auch wenn ich erstelle ein Objekt mit:

captureObject = captureClass.CallStatic<AndroidJavaObject>("instance"); 

Aber wenn ich versuche, den Zugang zu FFMpeg Bibliothek Methoden zu erhalten, wie in „setContext“ es schlägt fehl und gibt dies:

UnityEngine.AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/github/hiteshsondhi88/libffmpeg/FFmpeg; 
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/github/hiteshsondhi88/libffmpeg/FFmpeg; 
    at com.promineostudios.ffmpegcodec.FFMpegCodec.loadFFMpegBinary(FFMpegAndroidCodec.java:39) 
    at com.unity3d.player.UnityPlayer.nativeRender(Native Method) 
    at com.unity3d.player.UnityPlayer.a(Unknown Source) 
    at com.unity3d.player.UnityPlayer$b.run(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.github.hiteshsondhi88.libffmpeg.FFmpeg" on path: DexPathList[[zip file "/data/app/com.promineostudios.ffmpegmodule-1/base.apk"],nativeLibraryDirectories=[/data/app/com.promineostudios.ffmpegmodule-1/lib/arm, /vendor/lib, /system/lib]] 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
    at com.promineostudios.ffmpegcodec.FFMpegCodec.loadFFMpegBinary(FFMpegAndroidCodec.java:39)  
    at com.unity3d.player.UnityPlayer.nativeRender(Native Method)  
    at com.unity3d.player.UnityPlayer.a(Unknown Source)  
    at com.unity3d.player.UnityPlayer$b.run(Unknown Source) 

ich denke, dass das Problem in ist, wenn ich meine lib in Unity exportieren, aber ich weiß nicht, was falsch läuft. Wenn mir jemand helfen könnte, werde ich sehr geschätzt.

Dank und Entschuldigung für mein Englisch.

+0

ich lief in ein ähnliches Problem in der Lage zu laufen und zu fragen, war, wie Sie dieses Problem gelöst. – uchamp

+0

Hallo @uchamp, ich konnte nicht herausfinden, wie man es löst. Wenn Sie einen Weg finden, es funktioniert zu lassen, werde ich sehr geschätzt, wenn Sie es teilen. Es tut mir leid, dass ich dir nicht helfen konnte. – Nestoraj

+0

Haben Sie versucht, die .jar-Datei, die die Klassen "com.github.hiteshsondhi88.libffmpeg" enthält, auch in den Ordner "unity plugins" zu kopieren? – RandomCouch

Antwort

0

Ich weiß, dass Sie nicht mehr sind an diesem Projekt arbeiten Nestoraj, aber ich habe eine Lösung herausgefunden:

  1. Der Fehler Sie bekommen durch die UnityPlayerActivity verursacht wird nicht die Quelle zu finden, für com/github/hiteshsondhi88/libffmpeg/FFmpeg so zu fixieren, um, dass Sie das 'com.writingminds: FFmpegAndroid: 0.3.2' setzen müssen jAR-Datei in Ihrem Unity-Projekt Assets/Plugins/Android Ordner

  2. Danach und Laufen zu tun Das Projekt, Sie erhalten immer noch einen Fehler beim Laden der Ffmpeg-Binärdatei, dies ist, weil es auch nicht richtig Paket ist d in Unity, um dies zu beheben, müssen Sie Ihr Projekt nach Gradle/Android Studio exportieren, und dann innerhalb Ihres src/main/jniLibs-Verzeichnisses müssen Sie die ffmpeg .so-Binärdateien gemäß jeder Architektur so jniLibs/armeabi-v7a ablegen /libARM_ARCH.so jniLibs/armeabi/libARM_ARCH.so usw. Dann müssen Sie auch die ffmpeg-Objektdateien innerhalb von src/main/assets und wieder nach jeder Architektur wie folgt platzieren: src/main/assets/armeabi-v7a/ffmpeg usw.

Sobald diese zwei Schritte abgeschlossen sind, sollen Sie Ihr Projekt in Android Studio und laden Sie die ffmpeg in Ihrem Unity Projekt

Verwandte Themen