'warning BG8102: Class X has unknown base type Y' 在 xamarin 中绑定 java 代码时发出警告
'warning BG8102: Class X has unknown base type Y' warning while binding java code in xamarin
我目前正在尝试获取以 java(.jar 文件)编写的 SDK,以便与 Xamarin.Android 一起使用。因此,我尝试按照官方教程(https://docs.microsoft.com/en-us/xamarin/android/platform/binding-java-library/binding-a-jar)绑定.jar 文件。如何在没有源代码的情况下摆脱警告 'warning BG8102: Class X has unknown base type Y.'?
不幸的是,我没有取得那么大的成功,因为只有一小部分 classes 可以正确绑定。我查看了控制台,看到了很多类似的警告 'warning BG8102: Class Wangpos.Sdk4.Libbasebinder.IDCard has unknown base type wangpos.sdk4.libbasebinder.a.'。所有其他警告大多相同 - 只有 classes 不同(基本类型保持不变)。我已经尝试反汇编 .jar SDK 文件,但是基础 class 'a' 似乎并没有异常。除了 java 本机参考之外没有其他参考。
拆解后的一小段 class。
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=""sdk4.wangpos.libemvbinder"" 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=""debug"" 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="""" 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=""1.3"" visibility="public" volatile="false">
</field>
</class>
没有为此class生成相应的.cs文件。
更新: Link .jar SDK文件,给大家试试:https://www.dropbox.com/sh/msy3pa65x6u1ou7/AACb0rZBo3u3g33-XuRA7U6Ca?dl=0
最终,由于 .jar 绑定,预期结果将是完整或几乎完整的 SDK classes 在 c# 中的可用性。
由于我是 java 在 xamarin 中绑定的新手,非常感谢任何提示。
通常,我们会在各自的 .jar/.aar
库中看到混淆类型的特征,我们必须对它们进行解密,以便绑定生成器生成相应的 C# 类型。
你可以试试这个,在你的库 - Transforms - Metadata.xml 添加:
<attr path="/api/package[@name='{package_name}']/class[@name='{name}']" name="obfuscated">false</attr>
我目前正在尝试获取以 java(.jar 文件)编写的 SDK,以便与 Xamarin.Android 一起使用。因此,我尝试按照官方教程(https://docs.microsoft.com/en-us/xamarin/android/platform/binding-java-library/binding-a-jar)绑定.jar 文件。如何在没有源代码的情况下摆脱警告 'warning BG8102: Class X has unknown base type Y.'?
不幸的是,我没有取得那么大的成功,因为只有一小部分 classes 可以正确绑定。我查看了控制台,看到了很多类似的警告 'warning BG8102: Class Wangpos.Sdk4.Libbasebinder.IDCard has unknown base type wangpos.sdk4.libbasebinder.a.'。所有其他警告大多相同 - 只有 classes 不同(基本类型保持不变)。我已经尝试反汇编 .jar SDK 文件,但是基础 class 'a' 似乎并没有异常。除了 java 本机参考之外没有其他参考。
拆解后的一小段 class。
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=""sdk4.wangpos.libemvbinder"" 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=""debug"" 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="""" 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=""1.3"" visibility="public" volatile="false">
</field>
</class>
没有为此class生成相应的.cs文件。
更新: Link .jar SDK文件,给大家试试:https://www.dropbox.com/sh/msy3pa65x6u1ou7/AACb0rZBo3u3g33-XuRA7U6Ca?dl=0
最终,由于 .jar 绑定,预期结果将是完整或几乎完整的 SDK classes 在 c# 中的可用性。
由于我是 java 在 xamarin 中绑定的新手,非常感谢任何提示。
通常,我们会在各自的 .jar/.aar
库中看到混淆类型的特征,我们必须对它们进行解密,以便绑定生成器生成相应的 C# 类型。
你可以试试这个,在你的库 - Transforms - Metadata.xml 添加:
<attr path="/api/package[@name='{package_name}']/class[@name='{name}']" name="obfuscated">false</attr>