web-dev-qa-db-fra.com

xamarin Android: "Impossible de créer JavaTypeInfo pour la classe"

Lors de la construction, le compilateur génère l'erreur suivante:

Erreur Impossible de créer JavaTypeInfo pour la classe: App.Droid.Controls.WebViewJavaScriptInterface en raison de System.NullReferenceException: référence d'objet non définie sur une instance d'un objet. à Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor (String name, String signature, String connector, String managedParameters, StringuterType, String superCall) at Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Sign Méthode MethodDefinition, ExportAttribute export) sur Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.AddMethod (MethodDefinition registeredMethod, MethodDefinition implementedMethod) sur Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapper Type, JavaTallener .Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator..ctor (TypeDefinition type, Action2 log) at Xamarin.Android.Tasks.Generator.GenerateJavaSource (TaskLoggingHelper log, TypeDefinition t, String outputPath, String applicationJavaClassRool, Boolean, Boolean

J'ai créé un rendu personnalisé pour la vue Web, où j'essaie d'injecter JavaScriptInterface. J'ai une solution avec différents projets, ce qui pourrait être la raison du problème ci-dessus, ou peut-être pas.

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);
    }
}

Je m'attendais à ce que l'application s'exécute sans aucun problème de complietime, et une fois la vue Web chargée, javascriptInterface devrait fonctionner.

6
Srikar

En fonction de votre erreur de générateur, le ExportAttribute est utilisé pour demander au "générateur de code Java d'exporter une méthode Java qui devient un Android Callable Wrapper (ACW) "et Dictionary<string, object> n'est pas un Java (duh) et le générateur de code Java n'a aucune idée de comment le gérer).

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

Donc, la solution simple à ce problème était de changer le type de paramètre de Dictionary<string, object> à Java.Lang.Object. Maintenant, le générateur de code Java peut générer correctement un ACW et la compilation réussit.

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

J'ai également rencontré cela, il semble que les didacticiels Xamarin devraient en avertir les gens.

0
Chris