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

Sri*_*kar 4 android xamarin xamarin.forms

在生成时,编译器将引发以下错误:

错误由于System.NullReferenceException,无法为类App.Droid.Controls.WebViewJavaScriptInterface创建JavaTypeInfo:对象引用未设置为对象的实例。在Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor(在Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor(在Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor( Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.AddMethod上的MethodDefinition方法,ExportAttribute导出)互操作工具。

我已经为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Sum*_*ant 7

无法为类创建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'.
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 感谢您的回答。但是 Xamarin 来了...现在是 2019 年了。停止使用 Windows 95 API 访问文件。NTFS没有256的限制。 (2认同)

nzr*_*tmn 6

所以这肯定与 Windows 上的 MAX_PATH 问题有关。这是关于这个长dicussion这里。希望根据微软支持团队的说法,他们正在计划解决这个问题并删除 MAX_PATH 作为限制;但目前我使用的是最新版本的 Visual Studio(Microsoft Visual Studio 2019 版本 16.2.3),我仍然遇到相同的错误。

Microsfot 支持团队:

为什么那些 .java 名称这么长的一些背景。Java 要求类名必须与文件名匹配(Unlikc C#)。并且由于其中一些 android 类型的名称非常长,因此我们无法更改它们目前将项目移至更靠近驱动器根目录的位置是最简单的解决方案。

我通过将我的项目移动到目录并重命名长文件夹名称来解决这个问题。


Leo*_*SFT 1

根据您的构建器错误,ExportAttribute用于指示 \xe2\x80\x9cJava 代码生成器导出成为 Android Callable Wrapper (ACW)\xe2\x80\x9d 的 Java 方法,并且Dictionary<string, object> is not a Java object (duh) and the Java code generator has no idea how to handle it.

\n\n
[Java.Interop.Export("navigateTo")]\n[JavascriptInterface]\npublic void NavigateTo(Dictionary<string, object> dict)\n{\n   Console.WriteLine(dict);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,解决此问题的简单方法是将参数类型从 切换Dictionary<string, object>Java.Lang.Object. Now the Java code generator can properly generate an ACW and the compilation succeeds.

\n\n
[Java.Interop.Export("navigateTo")]\n[JavascriptInterface]\npublic void NavigateTo(Java.Lang.String dict)\n{\n    Console.WriteLine(dict);\n}\n
Run Code Online (Sandbox Code Playgroud)\n