xamarin android构建错误:“无法为类创建JavaTypeInfo”

时间:2019-01-25 08:29:50

标签: android xamarin xamarin.forms

在构建时,编译器将引发以下错误:

  

错误无法为类创建JavaTypeInfo:   App.Droid.Controls.WebViewJavaScriptInterface由于   System.NullReferenceException:对象引用未设置为实例   一个对象。在   Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor(字符串   名称,字符串签名,字符串连接器,字符串managedParameters,   字符串externalType,字符串superCall)位于   Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor(MethodDefinition   方法,ExportAttribute导出)位于   Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.AddMethod(MethodDefinition   已注册方法,已实现MethodDefinition)   Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator..ctor(TypeDefinition   类型,字符串externalType,Action2日志)   Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator..ctor(TypeDefinition   类型,Action2日志)在   Xamarin.Android.Tasks.Generator.GenerateJavaSource(TaskLoggingHelper   日志,TypeDefinition t,字符串outputPath,字符串applicationJavaClass,   布尔值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);
    }
}

我希望该应用程序可以正常运行,并且在webview加载javascriptInterface后即可正常工作。

5 个答案:

答案 0 :(得分:6)

因此,这肯定与Windows上的MAX_PATH问题有关。这是关于here的漫长讨论。希望根据Microssoft支持团队的意见,他们正在计划解决此问题并取消MAX_PATH作为限制;但此刻我使用的是Visual Studio的最新版本(Microsoft Visual Studio 2019版本16.2.3),我仍然遇到相同的错误。

Accoridng Microsfot支持团队:

  

为什么这些.java名称这么长的一些背景。 Java要求类名必须与文件名(Unlikc C#)匹配。而且,由于其中一些android类型的名称确实很长,我们处于无法更改它们的位置。?现在,将项目移至驱动器根附近是最简单的解决方案。

我通过将项目移至目录并重命名长文件夹名称来解决该问题。

答案 1 :(得分:2)

无法为类创建JavaTypeInfo-Visual Studio 2019中的Xamarin Forms模板生成错误

我遇到了类似的错误:(尽管细节有所不同,请参见下文)

Failed to create JavaTypeInfo for class:
 Android.Support.V4.View.Accessibility.AccessibilityManagerCompat/IAccessibilityStateChangeListenerImplementor 
due to System.IO.DirectoryNotFoundException: 
Could not find a part of the path '...\obj\Debug\81\android\src\mono\android\support\v4\view\accessibility\AccessibilityManagerCompat_AccessibilityStateChangeListenerImplementor.java'.

这是在升级到 Xamarin Forms 4.x 之后的 Visual Studio 2019 ,尽管我认为升级在这里并不重要。

此问题已在Visual Studio开发人员社区-https://developercommunity.visualstudio.com/content/problem/521034/failed-to-create-javatypeinfo.html

中报告过。

对我来说,这是一个“ 长途之路”问题,正如开发社区中其他一些用户所报告的那样(请参阅上面的链接)。一旦我将解决方案上移了几个目录以减小总路径长度,它就可以正常工作。

答案 2 :(得分:0)

根据您的构建器错误,ExportAttribute用于指示“ Java代码生成器导出成为Android可调用包装程序(ACW)的Java方法”,而Dictionary<string, object>不是Java对象(duh),而Java代码生成器不知道如何处理它。

[Java.Interop.Export("navigateTo")]
[JavascriptInterface]
public void NavigateTo(Dictionary<string, object> dict)
{
   Console.WriteLine(dict);
}

因此,解决此问题的简单方法是将参数类型从Dictionary<string, object>切换为Java.Lang.Object。现在,Java代码生成器可以正确生成ACW,并且编译成功。

[Java.Interop.Export("navigateTo")]
[JavascriptInterface]
public void NavigateTo(Java.Lang.String dict)
{
    Console.WriteLine(dict);
}

答案 3 :(得分:0)

我也遇到了这个问题,似乎Xamarin教程应该警告人们这一点。

答案 4 :(得分:0)

当我第一次构建移动应用程序时,我遇到了同样的异常。 错误代码为XA4209,建议: 完全限定的文件名必须少于260个字符,目录名称必须少于248个字符。

更改路径字符后,一切正常。