【发布时间】: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";,
不知道是不是和之前的问题有关。
感谢您的建议
【问题讨论】: