3

我正在尝试将本机项目中的一些 jar 嵌入到我的 Xamarin Android 应用程序中,并且遇到了两个单独的(但我怀疑相关的)问题:

  1. 包中的文件之一是 jna-4.2.0.jar。当我尝试自行构建绑定项目时,出现此错误:

命名空间“Com.Sun.Jna”中不存在类型或命名空间名称“ICallback”(您是否缺少程序集引用?)

生成的代码如下:

    [Register ("getCallback", "(Ljava/lang/Class;Lcom/sun/jna/Pointer;)Lcom/sun/jna/Callback;", "")]
    public static unsafe global::Com.Sun.Jna.ICallback GetCallback (global::Java.Lang.Class type, global::Com.Sun.Jna.Pointer p)
    {
        if (id_getCallback_Ljava_lang_Class_Lcom_sun_jna_Pointer_ == IntPtr.Zero)
            id_getCallback_Ljava_lang_Class_Lcom_sun_jna_Pointer_ = JNIEnv.GetStaticMethodID (class_ref, "getCallback", "(Ljava/lang/Class;Lcom/sun/jna/Pointer;)Lcom/sun/jna/Callback;");
        try {
            JValue* __args = stackalloc JValue [2];
            __args [0] = new JValue (type);
            __args [1] = new JValue (p);
            global::Com.Sun.Jna.ICallback __ret = global::Java.Lang.Object.GetObject<global::Com.Sun.Jna.ICallback> (JNIEnv.CallStaticObjectMethod  (class_ref, id_getCallback_Ljava_lang_Class_Lcom_sun_jna_Pointer_, __args), JniHandleOwnership.TransferLocalRef);
            return __ret;
        } finally {
        }
    }

我还尝试从https://github.com/java-native-access/jna下载最新版本 jna-4.4.0.jar ,但这会产生相同的错误。

  1. 我正在使用的库会生成此错误:

“版本”未实现接口成员“IComparable.CompareTo(Object)”

我试图解决这个问题,遵循 Xamarin 文档,并使用生成cs文件中的注释,通过将此行添加到metadata.xml我的绑定项目中的文件中:

<attr path="/api/package[@name='com.innovatrics.iface']/class[@name='Version']/method[@name='compareTo' 
    and count(parameter)=1 
    and parameter[1][@type='com.innovatrics.iface.Version']]" 
    name="managedType">Java.Lang.Object</attr>

但这似乎根本没有效果。

4

2 回答 2

3

在这种情况下,您是否尝试更改类名?

尝试在Metadata.xml文件中添加以下内容(未经测试):

<attr path="/api/package[@name='com.sun.jna']/interface[@name='Callback']" name="name">ICallback</attr>

这会将接口名称从CallbackJava 更改ICallback为 C#

于 2018-02-21T10:40:47.893 回答
0

使用上述重命名方法,我能够克服这个问题,但在尝试绑定 JNA Jar 文件时发现了更多错误。

我想知道,您在这方面能走多远,如果可能的话,可以分享允许您完成此绑定的 Metadata.xml 文件吗?

于 2019-10-08T11:07:20.247 回答