有几种方法可以将Andorid aka-native代码(Java代码)集成到Xamarin项目中。本文列出了官方方式。
我们正在尝试使用本文中描述的 Java 库绑定方法。我们的测试和 oid 库专门针对这个问题发布在 Github 上。
我们在 Android Developer 工具中创建了它,将其设置为 Java Android Library。它在 Eclipse 中内置为一种.jar格式,Xamarin 网站上的教程认为该格式就足够了。
如果我们尝试将.jar绑定到 Visual Studio 中的项目中,对象资源管理器将向我们显示绑定 asseblie 的命名空间,但在代码中,即使引用了程序集,我们也无法访问命名空间中的方法和类,在我们的测试 java android lib 中清除。
另一方面,当我们采用几乎任何.jar时,即互联网上的 android 库(例如这个),我们可以毫无问题地绑定它并访问它的方法。
请比较两个.jar,如果可能的话,让我知道我们在 github 上的测试 android 库出了什么问题,这导致我们的命名空间无法从代码中获取。
我读了你读的同一篇绑定Java库的文章,仔细阅读了说明,没有构建错误。当我尝试使用jar文件中的类时,智能感知无法识别任何内容。然后,我阅读了有关 API 元数据参考的后续文章。这让我想到也许我应该尝试编辑转换/元数据.xml文件。在简短地编辑该内容以包含包的重命名后,Visual Studio 允许(在编译后)引用 jar 文件中的类。然后,我尝试从类中调用一个方法,再次遇到另一个编译器错误。因此,我返回到 Metadata.xml 文件并添加了一个条目来重命名有问题的方法。我编辑了我的代码以调用重命名的方法,Visual Studio编译得很好。我将此调用集成到单元测试用例中,它通过了!
从我的阅读来看,似乎没有必要编辑元数据.xml文件,但至少根据我的经验,这似乎是必要的。它在 obj/Release/api.xml 文件上使用 XPATH(如 API 元数据参考中所述)。从那篇文章中,有重命名包和方法名称的示例,因此插入到我的 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 允许你在"添加"文件夹中创建 C# 类。因此,我创建了一个包装类,该包装类公开其他项目可以访问的托管 C# 类中的方法。由于它是C#,因此Visual Studio没有抱怨。
下面是我之前的示例中的包装类的外观(显然,您会选择一个对手头任务更有意义的名称):
public class InovcationWrapper
{
public static void InvokeMethod(...)
{
MyRenamedPackage.MyClass.RenamedDotNetMethod(...);
}
}
然后在你的项目代码中,如果你只调用你的包装类,你就会有完整的智能感知:
InvocationWrapper.InvokeMethod(...);
这使得使用起来更加容易,并限制了代码中要忽略的红色波浪线的数量。希望这有帮助!