2016-04-28 16 views
1

Android Studioに別のライブラリが含まれているライブラリを生成しようとすると、いくつか問題が発生します。まず、Android Studio 2.0とUnity 5.3.4f1を使用しています。私がやりたいことは、UnityにFFMpegを統合することです。そのため、FFMpegライブラリを仲介者として使用する独自のライブラリを作成することにしました。 FFMpegライブラリはhereです。java.lang.NoClassDefFoundError Android Studio Unity

私は、Android Studioで新しい空のプロジェクトを作成し、その中、新規作成>モジュール - > Androidのライブラリを使用して、自分のライブラリーになり、新しいモジュールを作成し、「ffmpegcodec」と名付け開始します。その後、私は新しいモジュールのフォルダおよびペースト内部build.gradleファイルを開く:

compile 'com.writingminds:FFmpegAndroid:0.3.2' 

が内側ブラケットを依存関係を、そして(これは、任意のエラーを示さなかった)同期をクリックします。

ことがのsrc /メイン/ javaの/パッケージ名/、それFFMpegCodecという名前の内側に新しいJavaクラスを作成した後。このペーストの内部に次のコードが貼り付けられています。

基本的にFFmpegのインスタンスを生成し、ffmpegコマンドを呼び出します。

私は私のアプリのgraddleで私のlibを含めるように、使用して私のプロジェクトでそれをテストすることを決めた、私は私のlibが行われた後:私はちょうど私のMainActivityにこのコードを貼り付けその後

compile project(':ffmpegcodec') 

を:

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

} 

その後、私は自分のプロジェクトを実行します。ボタンを押すと、そのすべてがokです.ffmpegのバージョンが表示されます。 libが動作することを確認したら、Unityに移動することにします。ffmpegcodec-realese.arrファイルをffmpegcodec/build/outputs/aarフォルダにコピーしてUnityプロジェクトに貼り付けます。次に、これを含むlibを使用するC#スクリプトを作成しました。

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) 

は、私は、問題は、私はUnityに私のlibをエクスポートするときにあると思いますが、私は間違って起こっているのか分かりません。もし誰かが私を助けることができたら、私は本当に感謝します。

私の英語のためにありがとう、すみません。

+0

我々は同様の問題に遭遇し、これを解決する方法を疑問に思ったの内側にffmpegのバイナリをロードすることができるはずです。 – uchamp

+0

こんにちは@uchamp、私はそれを解決する方法を見つけることができませんでした。あなたがそれを共有する場合、私は本当に感謝されるように動作するように方法を見つける場合。私はあなたを助けることができないのは残念です。 – Nestoraj

+0

"com.github.hiteshsondhi88.libffmpeg"クラスを含む.jarファイルをunity pluginsフォルダにコピーしようとしましたか? – RandomCouch

答えて

0

私はあなたがもはやしかし、私は解決策を考え出してきた、このプロジェクトNestorajに取り組んでいる知っている:

  1. をあなたが取得しているエラーは、COM /ソースが見つからないUnityPlayerActivityによって引き起こされますgithubの/ hiteshsondhi88/libffmpeg/FFmpegのあなたは「com.writingminds 0.3.2:FFmpegAndroid」入れなければならないことを固定するためになるようにやって実行した後、あなたのユニティプロジェクトの資産/プラグイン/ Androidのフォルダ内のjarファイル

  2. をこのプロジェクトでは、ffmpegバイナリファイルの読み込み中にエラーが発生することがあります。これは、正しくパッケージされていないためですdをUnityで修正するには、プロジェクトをGradle/Android Studioにエクスポートしてから、src/main/jniLibsディレクトリ内にffmpeg .soバイナリファイルを配置する必要があります.jniLibs/armeabi-v7a /libARM_ARCH.so jniLibs/armeabi/libARM_ARCH.soなど。次に、src/main/assets内にffmpegオブジェクトファイルを置き、src/main/assets/armeabi-v7a/ffmpegなどの各アーキテクチャに従って再度配置する必要があります。

これらの2つのステップが完了したら、あなたは、Android Studioでプロジェクトを実行し、ユニティプロジェクト

関連する問題