在构建时,编译器将引发以下错误:
错误无法为类创建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后即可正常工作。
答案 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)
我遇到了类似的错误:(尽管细节有所不同,请参见下文)
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个字符。
更改路径字符后,一切正常。