У меня возникли проблемы, когда я пытаюсь создать библиотеку, содержащую другую в 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, но я не знаю, что происходит не так. Если кто-нибудь может мне помочь, я буду очень благодарен.
Спасибо и извините за мой английский.
мы столкнулись с подобной проблемой, и было интересно, как вы решили эту. – uchamp
Привет @uchamp, я не мог понять, как его решить. Если вы найдете способ сделать это, я буду очень благодарен, если вы поделитесь им. Мне жаль, что ты мне не помог. – Nestoraj
Вы пытались также скопировать файл .jar, содержащий классы «com.github.hiteshsondhi88.libffmpeg» в папку с единственными плагинами? – RandomCouch