簡體   English   中英

java.lang.NoClassDefFoundError Android Studio Unity

[英]java.lang.NoClassDefFoundError Android Studio Unity

當我嘗試在Android Studio中生成包含另一個庫的庫時,我遇到了一些麻煩。 首先,我使用的是Android Studio 2.0和Unity 5.3.4f1。 我想要做的是在Unity中集成FFMpeg,所以我決定創建自己的庫,使用FFMpeg庫作為中介。 FFMpeg庫就在這里

首先,我在Android Studio中創建了一個新的空項目,在其中創建了一個新模塊,它將是我的庫,使用New-> Module-> Android Library並將其命名為“ffmpegcodec”。 之后,我在新模塊文件夾中打開build.gradle文件並粘貼:

compile 'com.writingminds:FFmpegAndroid:0.3.2'

在依賴項括號內,單擊“ 同步” (它沒有顯示任何錯誤)。

之后在src / main / java / package-name /中創建一個新的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包含在我的app 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 / outputs / 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");

但是當我嘗試訪問“setContext”中的FFMpeg庫方法時,它會失敗並返回:

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但我不知道出了什么問題。 如果有人能幫助我,我將非常感激。

謝謝,請原諒我的英語。

我知道你不再在Nestoraj這個項目上工作了,但是我找到了一個解決方案:

  1. 你得到的錯誤是由於UnityPlayerActivity沒有找到com / github / hiteshsondhi88 / libffmpeg / FFmpeg的來源所以為了解決這個問題你必須把'com.writingminds:FFmpegAndroid:0.3.2'jar文件放在你的Unity項目的Assets / Plugins / Android文件夾

  2. 在執行此操作並運行項目之后,您仍然會在加載ffmpeg二進制文件時出錯,這是因為它也未在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等。

完成這兩個步驟后,您應該能夠在Android Studio中運行項目並在Unity項目中加載ffmpeg二進制文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM