在生成时,编译器将引发以下错误:
为类创建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);
}

08-18 12:33