【问题标题】:Xamarin Binding Jar gives error: does not implement inherited abstract member AsyncTask.DoInBackground(params Object[])Xamarin Binding Jar 给出错误:不实现继承的抽象成员 AsyncTask.DoInBackground(params Object[])
【发布时间】:2017-10-05 22:09:04
【问题描述】:

我想使用我的 Xamarin.Android 项目中的 .jar 文件。

创建绑定项目并尝试构建后,出现此错误:

obj\Debug\generated\src\Com.Acrcloud.Rec.Sdk.Utils.ACRCloudGetIPAddressAsyncTask.cs(23,23): Error CS0534: 'ACRCloudGetIPAddressAsyncTask' does not implement inherited abstract member 'AsyncTask.DoInBackground(params Object[])' (CS0534)

使用反编译器,我检查了ACRCloudGetIPAddressAsyncTask 的内容,发现:

package com.acrcloud.rec.sdk.utils;

import android.os.AsyncTask;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class ACRCloudGetIPAddressAsyncTask
extends AsyncTask<String, Integer, String>
{
    private static final String TAG = "ACRCloudAsynGetIPAddressTask";

    protected String doInBackground(String... params)
    {
        String ip = "";
        try
        {
            InetAddress x = InetAddress.getByName(params[0]);

            ip = x.getHostAddress();
        }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
            ip = "";
        }
        catch (Exception e2)
        {
            ip = "";
        }
       return ip;
  }

  protected void onPostExecute(String ip)
  {
     super.onPreExecute();
     ACRCloudLogger.d("ACRCloudAsynGetIPAddressTask", ">>>>>>>>>>>>>>>  " + ip);
     com.acrcloud.rec.sdk.recognizer.ACRCloudRecognizerRemoteImpl.serverIP = ip;
  }
}

为什么我什至需要实现DoInBackground(params Object[])?生成的 C# 代码实现了 protected virtual unsafe string DoInBackground (params string[] @params) 以匹配 Java 代码中的内容...我对 Java 不太了解,所以我可能遗漏了一些东西...知道如何解决这个问题吗?

【问题讨论】:

    标签: java xamarin android-asynctask xamarin.android


    【解决方案1】:

    您可以查看这篇很棒的帖子:Approaching a Xamarin.Android Bindings Case,通过查看Adding Types 部分,当我们想要添加类、更改构造函数或切换泛型类型时,它使用&lt;add-node&gt;

    对于你的lib,你可以打开Transforms文件夹下的Metadata.xml,然后添加这段代码:

    <add-node path="/api/package[@name='com.acrcloud.rec.sdk.utils']">
      <class abstract="false" deprecated="not deprecated" final="false" name="ACRCloudLocalRecognizerInitAsyncTask" static="true" visibility="public" extends="java.lang.Object">
      </class>
    
      <class abstract="false" deprecated="not deprecated" final="false" name="ACRCloudGetIPAddressAsyncTask" static="true" visibility="public" extends="java.lang.Object">
      </class>
    </add-node>
    

    那么就可以编译成功了,但是我没有测试这个lib引用到Xamarin.Android项目,你可能需要进一步研究使用这个lib。无论如何,那篇文章很有帮助。

    您也可以在 SO:Java Binding Abstract class not being generated 上查看类似案例。

    【讨论】:

    • 它有效,但我不明白为什么。您在Metadata.xml 中添加一个节点,使这些类扩展java.lang.Object 而不是AsyncTask&lt;String, Integer, String&gt; ...这有什么帮助?我知道它可以(因为它现在有效)但我不明白为什么?
    • @Darius,抽象成员是AsyncTask.DoInBackground(params Object[]),它改变了类,所以它们不会从需要实现这个成员的旧类继承,所以我说,你可能需要进一步研究如果你想使用原来的类,如果没有,你也可以删除它。
    • 从 Object 扩展类确实可以编译。但我需要 AsyncTask 的执行方法。有什么建议吗?
    【解决方案2】:
    <add-node path="/api/package[@name='yourpPackageName']">
       <class abstract="false" deprecated="not deprecated" final="false" name="YourClassName" static="true" visibility="public" extends="java.lang.Object"> </class>
    

    【讨论】:

    • 一些额外的信息会显着改善这个答案。此外,这个问题有两部分,这个答案最多只能解决其中一个。
    • 注意点 KevinO 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多