当我尝试在Android Studio中生成包含另一个库的库时,我遇到了一些麻烦。首先,我使用的是Android Studio 2.0和Unity 5.3.4f1。我想要做的是在Unity中集成FFMpeg,所以我决定创建自己的库,使用FFMpeg库作为中介。 FFMpeg库是here。
首先,我在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但我不知道出了什么问题。如果有人能帮助我,我将非常感激。
谢谢,请原谅我的英语。
答案 0 :(得分:0)
我知道你不再在Nestoraj这个项目上工作了,但是我找到了一个解决方案:
你得到的错误是由于UnityPlayerActivity找不到com / github / hiteshsondhi88 / libffmpeg / FFmpeg的来源所以为了解决这个问题你必须把'com.writingminds:FFmpegAndroid:0.3。 Unity项目的Assets / Plugins / Android文件夹中的2'jar文件
执行此操作并运行项目后,您仍然会在加载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二进制文件