我开发了一个Android绑定库来绑定打印机Android AAR文件(AAR的构建操作设置为LibraryProjectZip(,该项目使用Android 7.1、类解析Android类解析器和AndroidCodeGen Target:XAJavaInterop1编译我可以提供简单的项目,以便完全访问代码和库。
但我有以下错误:"类型或命名空间"ILlibrary"在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文件,该文件包含一个公共抽象类"Library":
[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需要ILlibrary而不是Library。
我试图修改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";,
我不知道这是否与之前的问题有关。
感谢您的任何建议
最后,我找到了纠正错误的方法,通过在元数据文件中添加以下行来修改接口的名称:
<attr path="/api/package[@name='com.sun.jna']/interface[@name='Library']" name="name">ILibrary</attr>
但现在我有错误告诉我JNIENv不包含像NewString这样的方法。我想知道这是否与我告诉我的警告有关,它无法加载.jar条目libjnidispatch.jnilib
有什么想法,谢谢