.jar android库导入Xamarin项目

时间:2014-04-08 17:14:02

标签: android binding xamarin android-library

有几种方法可以将Andorid aka-native代码(Java代码)集成到Xamarin项目中。官方方式列于this article

我们正在尝试使用本文中描述的Java Library Binding方法。 Our test andoid library is published on Github专门针对这个问题。

我们在Android Developer工具中创建了它,将其设置为Java Android Library。它在Eclipse中构建为.jar格式,Xamarin网站上的教程假设已足够。

如果我们尝试将.jar绑定到Visual Studio中的项目中,Object Explorer将向我们展示绑定asseblie的命名空间,但在代码中,即使引用了程序集,我们也无法访问这些方法和类。命名空间,在我们的测试java android lib中解除..

另一方面,当我们几乎任何.jar,它是互联网上的一个安卓库(例如this one)时,我们可以绑定它并访问它的方法没有问题。

请比较两个.jar,如果可能的话,让我知道我们在github上的测试安卓库有什么问题,导致我们的命名空间从代码中不可用。

1 个答案:

答案 0 :(得分:4)

我阅读了您所做的同一篇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(...);

这样可以更轻松地使用并限制代码中忽略的红色波浪线的数量。希望这有帮助!