2016-04-28 2 views
1

У меня возникли проблемы, когда я пытаюсь создать библиотеку, содержащую другую в Android Studio. Прежде всего, я использую Android Studio 2.0 и Unity 5.3.4f1. Я хочу интегрировать FFMpeg в Unity, поэтому я решил создать свою собственную библиотеку, которая использует библиотеку FFMpeg в качестве посредника. Библиотека FFMpeg - here.java.lang.NoClassDefFoundError Android Studio Unity

Для начала я создал новый пустой проект в Android Studio и внутри него, создается новый модуль, который будет моей библиотеке, используя New->> Android Модуль-библиотеки и назвал его «ffmpegcodec». После этого я открыл build.gradle файл в новой папке модуля и вставки:

compile 'com.writingminds:FFmpegAndroid:0.3.2' 

внутри зависимостей скобок и нажмите Синхронизировать (Он не показал ошибку).

После этого создайте новый Java-класс внутри SRC/имя пакета главная/Java// и назвал его FFMpegCodec. Внутри этой пасте этот код:

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 
    } 
} 

Это в основном создает экземпляр FFmpeg и делает вызовы FFmpeg команды.

После того, как я мой Lib сделал я решил проверить это в моем проекте, так что я включить мой LIB в моем приложении graddle с помощью:

compile project(':ffmpegcodec') 

После этого я просто вставить этот код на 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); 
     } 
    }); 

} 

После этого я запускаю свой проект, и когда я нажимаю кнопку, он возвращает все в порядке, показывая версию ffmpeg. Как только я проверил, что мои работы lib, я решил переместить его в Unity, поэтому скопируйте файл ffmpegcodec-realese.arr внутри ffmpegcodec/build/output/aar папку и вставьте ее в мой проект Unity. Затем я написал сценарий C# для использования моего lib, который содержит это:

using System; 
    using System.Runtime.InteropServices; 
    using UnityEngine; 
    using System.Collections; 
    using System.Diagnostics; 

    public class ScreenRecorder { 

    private AndroidJavaObject unityActivity = null; 
    private AndroidJavaObject captureObject = null; 

     // Use this for initialization 
     public ScreenRecorder() { 
      try{ 

       using (AndroidJavaClass unityPlayerActivityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { 
        unityActivity = unityPlayerActivityClass.GetStatic<AndroidJavaObject>("currentActivity"); 
       } 

       AndroidJavaClass captureClass = new AndroidJavaClass ("com.promineostudios.ffmpegcodec.FFMpegCodec"); 
       if (captureClass != null) { 
        captureObject = captureClass.CallStatic<AndroidJavaObject>("instance"); 
        captureObject.Call("setContext", unityActivity); 
        captureObject.Call("loadFFMpegBinary"); 
       } 
      }catch(Exception ex){ 
       UnityEngine.Debug.Log(ex); 
      } 
     } 

    } 

Проблемы возникают здесь. Когда я создаю экземпляр класса с помощью:

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

создает экземпляр правильно, а также при создании объекта с помощью:

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

Но когда я пытаюсь получить доступ к методам библиотеки FFMpeg, как в «SetContext» это не удается, и возвращает это:

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) 

Я думаю, что проблема заключается в том, когда я экспортировать свою LIB в Unity, но я не знаю, что происходит не так. Если кто-нибудь может мне помочь, я буду очень благодарен.

Спасибо и извините за мой английский.

+0

мы столкнулись с подобной проблемой, и было интересно, как вы решили эту. – uchamp

+0

Привет @uchamp, я не мог понять, как его решить. Если вы найдете способ сделать это, я буду очень благодарен, если вы поделитесь им. Мне жаль, что ты мне не помог. – Nestoraj

+0

Вы пытались также скопировать файл .jar, содержащий классы «com.github.hiteshsondhi88.libffmpeg» в папку с единственными плагинами? – RandomCouch

ответ

0

Я не знаю, что ты больше не работает над этим проектом Nestoraj, однако я понял, решение:

  1. Ошибка вы получаете вызвано UnityPlayerActivity не найти источник для ком/GitHub/hiteshsondhi88/libffmpeg/FFmpeg поэтому для того, чтобы установить, что вы должны поставить «com.writingminds: FFmpegAndroid: 0.3.2» банку файл внутри активов вашего проекта Unity/Plugins/Android папки

  2. После этого, что и бег в проекте вы по-прежнему будете получать ошибку при загрузке двоичного файла ffmpeg, это потому, что это также не правильно пакет d в Unity, чтобы исправить это, вам нужно экспортировать свой проект в Gradle/Android Studio, а затем в каталог src/main/jniLibs вы должны поместить двоичные файлы ffmpeg .so в соответствии с каждой архитектурой, поэтому jniLibs/armeabi-v7a /libARM_ARCH.so jniLibs/armeabi/libARM_ARCH.so и т. д. Затем вы также должны разместить объектные файлы ffmpeg внутри src/main/assets и снова в соответствии с каждой архитектурой: src/main/assets/armeabi-v7a/ffmpeg и т. д.

После того, как эти 2 шага сделаны, вы должны быть в состоянии запустить свой проект в Android Studio и загрузите FFmpeg бинарный внутри вашего проекта Unity