在生成时,编译器将引发以下错误:
为类创建javatypeinfo失败:
由于
system.nullreferenceexception:对象引用未设置为实例
一个物体的。在
Java.Iopop.Too.JavaCalable包装器.javaCabable WrAPPul生生器.签名. cTor(字符串)
名称,字符串签名,字符串连接器,字符串管理参数,
string outertype,string supercall)位于
java.opop.Too.javaCalable包装器.javaCabable WrAPPul生生器.签名. cTor(方法定义)
方法,exportattribute export)位于
java.opop.Too.JavaCalable包装器.javaCabable WrAPPul生生器.AddioMead(方法定义)
registeredMethod,methodDefinition implementedMethod)位于
JavaCalababeRePasp.javaCabable WrAPPul生生器…cTor(类型定义)
类型,字符串outertype,action2 log)位于
JavaCalababeRePasp.javaCabable WrAPPul生生器…cTor(类型定义)
类型,操作2日志)位于
xamarin.android.tasks.generator.generateJavaSource(任务日志助手
日志,类型定义T,字符串输出路径,字符串应用程序JavaClass,
布尔UseSharedRunTime,布尔GenerateOnCreateOverrides,布尔
hasexportreference)中的
我已经为webview创建了一个自定义渲染器,在这里我试图注入javascriptinterface。我有一个不同项目的解决方案,这可能是上述问题的原因,也可能不是。
public class WebviewRendererEX : WebViewRenderer
{
Context _context;
public WebviewRendererEX(Context context) : base(context)
{
_context = context;
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
CookieManager cm = CookieManager.Instance;
cm.SetAcceptCookie(true);
cm.SetAcceptThirdPartyCookies(Control, true);
Control.Settings.JavaScriptEnabled = true;
Control.Settings.DomStorageEnabled = true;
Control.AddJavascriptInterface(this, "Android");
Device.BeginInvokeOnMainThread(() =>
{
Control.EvaluateJavascript("function someNavigate(dict){Android.navigateTo(dict);}", null);
});
}
}
}
public class WebViewJavaScriptInterface : Java.Lang.Object
{
private Context context;
public WebViewJavaScriptInterface(Context context)
{
this.context = context;
}
[Java.Interop.Export("navigateTo")]
[JavascriptInterface]
public void NavigateTo(Dictionary<string, object> dict)
{
Console.WriteLine(dict);
}
}
我希望应用程序运行时不会出现任何complietime问题,而且一旦webview加载了javascriptinterface,它就会工作。
最佳答案
根据您的生成器错误,“cc”用于指示“Java代码生成器导出一个Java方法,它成为一个Android可调用包装器”,而不是一个Java对象(Java对象),Java代码生成器不知道如何处理它。
[Java.Interop.Export("navigateTo")]
[JavascriptInterface]
public void NavigateTo(Dictionary<string, object> dict)
{
Console.WriteLine(dict);
}
因此,解决这个问题的简单方法是将参数类型从
ExportAttribute
切换到Dictionary<string, object>
。现在Java代码生成器可以正确地生成ACW,编译成功。[Java.Interop.Export("navigateTo")]
[JavascriptInterface]
public void NavigateTo(Java.Lang.String dict)
{
Console.WriteLine(dict);
}