【问题标题】:.jar android library import into Xamarin project.jar android 库导入 Xamarin 项目
【发布时间】:2014-05-21 13:15:24
【问题描述】:

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

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

我们已在 Android 开发者工具中创建它,并将其设置为 Java Android 库。它在 Eclipse 中以 .jar 格式构建,Xamarin 网站上的教程假定它就足够了。

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

另一方面,当我们获取几乎任何 .jar 文件时,它是互联网上的一个 android 库(例如 this one),我们可以绑定它并毫无问题地访问它的方法。

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

【问题讨论】:

  • 您需要“Android 库”还是只需要一个常规库?您的示例 jar 不是一个 android 库,它是一个包含一堆已编译类的标准 java 库。这里的不同之处在于 Android 库包含的资源不仅可以共享 java 代码。由于您的示例 Test.java 与 android 没有任何关系,您只需编译并 jar 即可。
  • 将 *.jar 重命名为 *.zip 时,您可以使用任何存档工具查看内部。不知道 android 的要求,但是你的 GitHub..bin/a2dp.jar 包含 META-INF/MAINFEST.MF 没有 2 个字节,所以它看起来像一个编译器问题,请提供真正的 jar
  • 你应该试试这个xamarin Binding a Java Library!

标签: android binding xamarin android-library


【解决方案1】:

我阅读了与您相同的 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(...);

这使得使用起来更容易,并限制了代码中要忽略的红色曲线的数量。希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2015-05-28
    • 2016-01-13
    • 2014-01-03
    • 2014-10-03
    • 2014-01-12
    • 1970-01-01
    • 2017-12-25
    • 2017-08-11
    相关资源
    最近更新 更多