【问题标题】:Android binding library: Type or namespace not foundAndroid 绑定库:找不到类型或命名空间
【发布时间】:2021-09-27 08:06:36
【问题描述】:

我开发了一个 Android 绑定库来绑定打印机 Android AAR 文件(AAR 的构建操作设置为 LibraryProjectZip),项目使用 Android 7.1 编译,使用 class-parse android 类解析器和 AndroidCodeGen 目标:XAJavaInterop1 . 我可以提供简单的项目,以便完全访问代码和库

但我有以下错误:“类型或命名空间“ILibrary”在 Com.Sun.Jna.Native.cs 的命名空间“Com.Sun.Jna”中不存在。所以我决定使用反编译器检查 Android 库,结果如下:

  • AAR 文件包含一个接口“Library”(不是 ILibrary),Native.class 文件包含一个方法,其签名如下,是错误的来源,需要一个 Library 对象作为输入

    public static Library synchronizeLibrary(final Library library){...}

  • C# 生成的代码包含一个 Com.Sun.Jna.ILibrary.cs 文件,其中包含一个公共抽象类“库”:

    [Register ("com/sun/jna/Library", DoNotGenerateAcw=true)] public abstract class Library : Java.Lang.Object {...}

    但是生成的 Native.cs 文件有对应的方法 SynchronizeLibrary :

    // Metadata.xml XPath method reference: [Register ("synchronizedLibrary", "(Lcom/sun/jna/Library;)Lcom/sun/jna/Library;", "")] public static unsafe global::Com.Sun.Jna.ILibrary SynchronizedLibrary(global::Com.Sun.Jna.ILibrary library) {...}

我不明白为什么 C# 生成的方法 SynchronizedLibrary 需要 ILibrary 而不是库。

我尝试修改 Metadata.xml 文件以将类库重命名为 ILibrary,但没有成功。此外,我有一个警告说:

class-parse: warning: could not load .jar entry 'libjnidispatch.jnilib': System.Argument.OutOfRangeException,

我尝试使用<attr path="/api/package[@name='com.sun.jna']/class[@name='Library']" name="managedName">ILibrary</attr> 将接口名称从Library 更改为ILibrary,但接口的定义没有改变。奇怪的是,我有接口成员的引用路径,但没有接口本身

[Register ("com/sun/jna/Library", DoNotGenerateAcw=true)]
    public abstract class Library : Java.Lang.Object {

        internal Library ()
        {
        }

        // Metadata.xml XPath field reference: path="/api/package[@name='com.sun.jna']/interface[@name='Library']/field[@name='OPTION_ALLOW_OBJECTS']"
        [Register ("OPTION_ALLOW_OBJECTS")]
        public const string OptionAllowObjects = (string) "allow-objects";,

不知道是不是和之前的问题有关。

感谢您的建议

【问题讨论】:

    标签: android xamarin binding


    【解决方案1】:

    最后,我找到了纠正错误的方法,通过在元数据文件中添加以下几行来修改接口名称:

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

    但是现在我有错误告诉我 JNIENv 不包含像 NewString 这样的方法。而且我想知道它是否与我告诉我它无法加载 .jar 条目 libjnidispatch.jnilib 的警告有关

    任何想法,谢谢

    【讨论】:

      猜你喜欢
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2017-07-12
      • 2011-05-13
      相关资源
      最近更新 更多