'warning BG8102: класс X имеет неизвестный базовый тип Y' предупреждение при привязке кода Java в xamarin - PullRequest
2 голосов
/ 26 июня 2019

В настоящее время я пытаюсь получить SDK, написанный на Java (файл .jar), для работы с Xamarin.Android. Поэтому я пытаюсь связать файл .jar, следуя официальному руководству (https://docs.microsoft.com/en-us/xamarin/android/platform/binding-java-library/binding-a-jar). Как избавиться от предупреждения «BG8102: класс X имеет неизвестный базовый тип Y.», не имея исходного кода

К сожалению, у меня не было такого большого успеха, так как только небольшая часть классов будет правильно связываться. Я заглянул в консоль и увидел множество похожих предупреждений: предупреждение BG8102: класс Wangpos.Sdk4.Libbasebinder.IDCard имеет неизвестный базовый тип wangpos.sdk4.libbasebinder.a. '. Все остальные предупреждения были в основном одинаковыми - отличаются только классы (базовый тип остается прежним). Я попытался разархивировать файлы .jar SDK, однако базовый класс «а» не выглядит необычным. Никаких дополнительных ссылок, кроме нативных java.

Короткий фрагмент распущенного класса.


import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
import android.os.RemoteException;
import android.util.Log;
import java.util.concurrent.CountDownLatch;
import wangpos.sdk4.base.IBinderPool;


public class a
{
  private static final String a = "BaseBinder";
  public static final int BINDER_NONE = -1;
  private Context c;
  private static IBinderPool d = null;

  private static a e;
  private CountDownLatch f;
  protected boolean b = false;

  private a(Context context) {
    c = context;
    d = null;
    c();
  }


  public a() {}

  static a a(Context context)
  {
    if (d == null) {
      synchronized (a.class) {
        if (d == null) {
          e = new a(context);
        }
      }
    }
    return e;
  }

  private ServiceConnection g = new BaseBinder.1(this);
  ...
}

Соответствующий раздел сгенерированного файла api.xml:

    <class abstract="false" deprecated="not deprecated" extends="java.lang.Object" extends-generic-aware="java.lang.Object" jni-extends="Ljava/lang/Object;" final="true" name="a" static="false" visibility="public" jni-signature="Lsdk4/wangpos/libemvbinder/a;">
      <constructor deprecated="not deprecated" final="false" name="a" jni-signature="()V" bridge="false" static="false" type="sdk4.wangpos.libemvbinder.a" synthetic="false" visibility="public">
      </constructor>
      <field deprecated="not deprecated" final="true" name="a" jni-signature="Z" static="true" transient="false" type="boolean" type-generic-aware="boolean" visibility="public" volatile="false">
      </field>
      <field deprecated="not deprecated" final="true" name="b" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value="&quot;sdk4.wangpos.libemvbinder&quot;" visibility="public" volatile="false">
      </field>
      <field deprecated="not deprecated" final="true" name="c" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value="&quot;debug&quot;" visibility="public" volatile="false">
      </field>
      <field deprecated="not deprecated" final="true" name="d" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value="&quot;&quot;" visibility="public" volatile="false">
      </field>
      <field deprecated="not deprecated" final="true" name="e" jni-signature="I" static="true" transient="false" type="int" type-generic-aware="int" value="1" visibility="public" volatile="false">
      </field>
      <field deprecated="not deprecated" final="true" name="f" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value="&quot;1.3&quot;" visibility="public" volatile="false">
      </field>
    </class>

Для этого класса не создан соответствующий файл .cs.

ОБНОВЛЕНИЕ: Ссылка на файлы .jar SDK, для всех желающих попробовать: https://www.dropbox.com/sh/msy3pa65x6u1ou7/AACb0rZBo3u3g33-XuRA7U6Ca?dl=0

Наконец, ожидаемым результатом будет полная или почти полная доступность классов SDK в c # в результате привязки .jar.

Поскольку я новичок в java-связывании в xamarin, любые советы приветствуются.

1 Ответ

1 голос
/ 27 июня 2019

Обычно мы видим характеристики обфусцированных типов в наших соответствующих .jar/.aar библиотеках, и мы должны разблокировать их для генератора привязок для генерации соответствующих типов C #.

вы можете попробовать это this в вашемlibarary - Преобразования - Metadata.xml add:

<attr path="/api/package[@name='{package_name}']/class[@name='{name}']" name="obfuscated">false</attr>
...