.jar android库导入Xamarin项目

Max*_*lov 12 binding android android-library xamarin

有几种方法可以将Andorid aka-native代码(Java代码)集成到Xamarin项目中.本文列出了官方方法.

我们正在尝试使用本文中描述的Java Library Binding方法. 我们的测试andoid库专门针对这个问题发布在Github上.

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

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

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

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

odd*_*ter 5

我阅读了与您所做的同一篇“ 绑定Java库”文章,仔细阅读了说明,并且没有构建错误。当我尝试使用jar文件中的类时,intellisense无法识别任何内容。然后,阅读有关API元数据参考的后续文章。这让我想到也许应该尝试编辑Transforms / Metadata.xml文件。在简短地编辑以包括软件包的重命名之后,Visual Studio允许(在编译之后)从jar文件中引用类。然后,我尝试从类中调用方法,并且再次出现另一个编译器错误。因此,我返回了Metadata.xml文件,并添加了一个条目来重命名有问题的方法。我编辑了代码以调用重命名的方法,并且Visual Studio编译良好。我将此调用集成到一个单元测试用例中,并通过了!

根据我的阅读,似乎没有必要编辑Metadata.xml文件,但至少以我的经验,这似乎是必要的。它在obj / Release / api.xml文件上使用XPATH(如API元数据参考中所述)。从那篇文章中可以找到重命名包和方法名称的示例,因此,将其插入到Metadata.xml文件中对我来说并没有什么工作。此外,我从“ 绑定Java库”文章中下载了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>
Run Code Online (Sandbox Code Playgroud)

因此,现在在我的.NET代码中,我可以编写:

MyRenamedPackage.MyClass.RenamedDotNetMethod(...);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

编辑:

我对Xamarin工具包有了一些熟悉,并且进行了更新,以使使用此工具更加容易。

为了限制需要与jar方法交互的代码的参与,Xamarin允许您在Additions文件夹中创建C#类。因此,我创建了一个包装器类,该包装器类公开了其他项目可以访问的托管C#类中的方法。由于是C#,因此Visual Studio没有任何抱怨。

这是一个包装类,看起来像我前面的示例(显然,您会选择一个对手边的任务更有意义的名称):

public class InovcationWrapper
{
    public static void InvokeMethod(...)
    {
        MyRenamedPackage.MyClass.RenamedDotNetMethod(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在项目代码中,如果仅调用包装器类,则将具有完整的智能感知:

InvocationWrapper.InvokeMethod(...);
Run Code Online (Sandbox Code Playgroud)

这使得使用起来更加容易,并限制了代码中要忽略的红色花键的数量。希望这可以帮助!