我目前正在尝试从Android Studio为Unity构建本机插件。此插件的目的是将Google的Cast SDK用于Chromecast。我需要实现一个CAF发送器,但是由于以下原因,我还没走那么远:
java.lang.NoClassDefFoundError
我对此错误含糊不清的原因是因为它来自以下外部库中的任何元素:
com / google / android / gms / cast / framework /“某些类或可在此处绘制”
然后在调用堆栈中继续说,在DexPathList上找不到相同的类。
要执行此步骤,请执行以下操作:
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)
行,没有日志或吐司出现。
我遇到的第一个错误指定为:
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。最初的解决方案似乎很棘手,但显然可以。
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文件带到其中,但是随后我仍然遇到资源问题。
清单很简单,并且提供了我认为强制转换插件正常工作所需的内容。
到目前为止,我用于此目的的资源是:
以及其他一些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中并与项目一起打包的更多信息。
感谢您的时间和耐心阅读。