Chromecast Native Android到Unity插件,可能存在导入/导出问题

时间:2019-05-08 14:25:10

标签: android unity3d casting google-cast android-unity-plugin

目的和当前错误

我目前正在尝试从Android Studio为Unity构建本机插件。此插件的目的是将Google的Cast SDK用于Chromecast。我需要实现一个CAF发送器,但是由于以下原因,我还没走那么远:

  

java.lang.NoClassDefFoundError

我对此错误含糊不清的原因是因为它来自以下外部库中的任何元素:

  

com / google / android / gms / cast / framework /“某些类或可在此处绘制”

然后在调用堆栈中继续说,在DexPathList上找不到相同的类。

要执行此步骤,请执行以下操作:

  • 在Android Studio中构建我的模块以获取.aar
  • 将新的.aar导入我的Unity项目
  • 构建并在Android设备上运行
  • 点击一个按钮,该按钮调用一个本质上要求Cast上下文的函数
    public void InitFromUnity(final Context ctx, String msg)
    {
        new Handler(Looper.getMainLooper()).post((new Runnable() {
            @Override
            public void run() {
                //Crash here
                castContext = CastContext.getSharedInstance(ctx);

                if(castContext == null)
                {
                    Log.v("ChromeCastApp", "CAST CONTEXT NULL");
                    Toast.makeText(ctx, "No cast context", Toast.LENGTH_SHORT).show();

                }else
                {
                    Log.v("ChromeCastApp", "CAST CONTEXT FOUND");
                    Toast.makeText(ctx, "Cast Context Found", Toast.LENGTH_SHORT).show();
                }
            }
        }));
    }

我认为错误发生在castContext = CastContext.getSharedInstance(ctx)行,没有日志或吐司出现。

我尝试过的Hacky解决方案

我遇到的第一个错误指定为:

  

javaj.lang.NoClassDefFoundError:无法解决以下问题:Lcom / google / android / gms / cast / framework / CastContext`

因此,在这一点上,我搜索了我的外部库,并注意到其中一个Google Cast库中有一个classes.jar文件。我将其移至libs文件夹并重命名了。我为所有与Google Cast相关的库执行了此操作。

此时,我的错误更改为以下内容:

  

javaj.lang.NoClassDefFoundError:无法解决以下问题:Lcom / google / android / gms / cast / framework / R $ drawable`

现在,我很确定潜在的问题是依赖关系无法正确传递到Unity。最初的解决方案似乎很棘手,但显然可以。

Gradle

    apply plugin: 'com.android.library'

    android {
        compileSdkVersion 28

        defaultConfig {
            minSdkVersion 16
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"

            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }

        dexOptions {
            javaMaxHeapSize "4g"
        }

    }

    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
        implementation 'com.google.android.gms:play-services-cast:16.2.0'
        // https://mvnrepository.com/artifact/com.google.android.gms/play-services-cast
        implementation 'com.google.android.gms:play-services-cast-framework:16.2.0'
        // https://mvnrepository.com/artifact/com.android.support/appcompat-v7
        implementation group: 'com.android.support', name: 'appcompat-v7', version: '28.0.0'
        // https://mvnrepository.com/artifact/com.android.support/support-media-compat
        implementation group: 'com.android.support', name: 'support-media-compat', version: '28.0.0'
        // https://mvnrepository.com/artifact/com.android.support/support-compat
        implementation group: 'com.android.support', name: 'support-compat', version: '28.0.0'
        // https://mvnrepository.com/artifact/com.android.support/palette-v7
        implementation group: 'com.android.support', name: 'palette-v7', version: '28.0.0'
        // https://mvnrepository.com/artifact/com.android.support/mediarouter-v7
        implementation group: 'com.android.support', name: 'mediarouter-v7', version: '28.0.0'
        // https://mvnrepository.com/artifact/com.android.support/recyclerview-v7
        implementation group: 'com.android.support', name: 'recyclerview-v7', version: '28.0.0'
        implementation 'com.android.support:support-v4:28.0.0'
    }

清单

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="pp.zerolight.com.cc_plugin">

        <application
            android:allowBackup="true"
            android:supportsRtl="true">

            <meta-data
                android:name=
                    "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
                android:value="pp.zerolight.com.cc_plugin.CastOptionsProvider" />
        </application>
    </manifest>

从gradle中可以看到将要命中的lib根目录,并将强制转换的.jar文件带到其中,但是随后我仍然遇到资源问题。

清单很简单,并且提供了我认为强制转换插件正常工作所需的内容。

到目前为止,我用于此目的的资源是:

  1. https://developers.google.com/android/guides/setup
  2. https://developers.google.com/cast/docs/android_sender/
  3. https://developers.google.com/cast/docs/android_sender/integrate

以及其他一些Android到Unity插件的设置指南。

统一方

下面是完整的代码,它是Unity末尾的代码,它在Broadcast类中调用函数:

    AndroidJavaClass unityPlayerClass;
    AndroidJavaObject unityActivity;
    AndroidJavaObject broadcasterObj;

    #region Native Setup

    override protected void Setup()
    {
        unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        unityActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
        broadcasterObj = new AndroidJavaObject("pp.zerolight.com.cc_plugin.Broadcaster");
    }
    #endregion

    #region Features
    override public void SendMessage()
    {
        string msg = "Hello World";
        Debug.Log("Sending a message of " + msg);

        object[] parameters = new object[2];
        parameters[0] = unityActivity;
        parameters[1] = msg;

        broadcasterObj.Call("InitFromUnity", parameters);
    }
    #endregion

当我在Unity中按一个按钮作为测试时,将调用此代码。

摘要

我希望我可以在Broadcaster函数中获取castContext,但会得到类丢失错误。

不幸的是,我已经进行了将近一个星期的研究,没有运气,我希望其他人能帮助我。这个问题与如何使用Cast API有关。关于如何确保所有外部库都存在于Unity中并与项目一起打包的更多信息。

感谢您的时间和耐心阅读。

0 个答案:

没有答案