将.jar Android库导入Xamarin项目

13
有几种方法可以将Andorid aka本机代码(Java代码)集成到Xamarin项目中。官方方法在本文中列出。
我们正在尝试使用文章中描述的Java Library Binding方法。为了这个问题,我们的测试andoid库已经发布在Github上
我们在Android开发工具中创建它并将其设置为Java Android库。它在Eclipse中生成为.jar格式,Xamarin网站上的教程认为这已足够。
如果我们试图将.jar绑定到我们的Visual Studio项目中,对象浏览器将显示绑定程序集的命名空间,但是在代码中,即使引用了程序集,我们也无法访问在我们的测试java Android lib.中声明的方法和类。
另一方面,当我们获取几乎任何一个互联网上的android库的.jar文件时(例如此文件),我们可以将其绑定并访问其方法而不会出现问题。
请比较两个.jar文件,如果可能,请让我知道我们在Github上测试Android库的问题所在,导致我们的命名空间无法从代码中使用。

你需要一个“Android库”还是普通库?你的示例jar不是Android库,它是一个包含编译类的标准Java库。区别在于,Android库包含资源以分享不仅仅是Java代码。由于你的示例Test.java与Android无关,你可以直接编译并打包成jar文件。 - Cem Özer
将*.jar重命名为*.zip后,您可以使用任何存档工具查看其内部。不清楚Android的要求,但是您的GitHub..bin/a2dp.jar包含META-INF/MAINFEST.MF,其中有2个字节的空白,因此看起来像是编译器问题,请提供真正的jar文件。 - xmojmr
你应该尝试一下 xamarin 绑定 Java 库! - LOG_TAG
1个回答

5
我读了你阅读的同一篇文章Binding a Java Library,按照指示进行操作后没有出现任何构建错误。但是当我尝试使用来自我的jar文件的类时,Intellisense没有识别到任何内容。然后我阅读了API Metadata Reference的后续文章。这让我想到也许我应该尝试编辑Transforms/Metadata.xml文件。稍微编辑一下以包括一个包的重命名后,Visual Studio允许(编译后)引用来自jar文件的类。然后我尝试调用类中的方法,又再次得到了编译器错误。所以,我回到Metadata.xml文件中并添加了一个条目以重命名相关方法。我编辑了我的代码以调用已重命名的方法,Visual Studio编译通过了。我将此调用集成到一个单元测试用例中,它通过了!
从我的阅读来看,似乎不需要编辑Metadata.xml文件,但至少在我的经验中似乎是必要的。它在obj/Release/api.xml文件上使用XPATH(如API Metadata Reference所述)。从那篇文章中,有重命名包和方法名称的示例,所以对我来说,将其插入到我的Metadata.xml文件中并不需要太多工作。此外,我还从Binding a Java Library文章中下载了OsmBindingDroidExample,并查看了他们的Metadata.xml文件。
以下是我参考的XML:
<metadata>
  <attr path="/api/package[@name='com.abc.def']" name="managedName">MyRenamedPackage</attr>
  <attr path="/api/package[@name='com.abc.def']/class[@name='MyClass']/method[@name='originalJavaMethod']" name="managedName">RenamedDotNetMethod</attr>
</metadata>

所以,现在在我的.NET代码中,我可以写:

MyRenamedPackage.MyClass.RenamedDotNetMethod(...);

希望这能帮到您!
编辑:
我已经更加熟悉Xamarin工具包,并且有一个更新,使其更容易使用。
为了限制需要与jar方法交互的代码参与,Xamarin允许您在Additions文件夹中创建C#类。因此,我创建了一个包装器类,将方法暴露在一个托管的C#类中,其他项目可以访问。由于它是C#,所以Visual Studio不会抱怨。
以下是一个包装器类的示例,与我之前的示例相同(显然,您会选择一个更有意义的名称):
public class InovcationWrapper
{
    public static void InvokeMethod(...)
    {
        MyRenamedPackage.MyClass.RenamedDotNetMethod(...);
    }
}

然后在您的项目代码中,如果您只调用包装器类,则会获得完整的智能感知:

InvocationWrapper.InvokeMethod(...);

这使得与它一起工作变得更加容易,并且限制了在你的代码中需要忽略的红色波浪线数量。希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接