未生成 Java 绑定抽象类

Posted

技术标签:

【中文标题】未生成 Java 绑定抽象类【英文标题】:Java Binding Abstract class not being generated 【发布时间】:2016-08-07 12:45:30 【问题描述】:

错误 CS0234:类型或命名空间名称 IBitmap' does not exist in the namespaceCom.Sushi.Hangover'。您是否缺少程序集参考?

我有一个 android 绑定项目,它有从多个接口继承的类,但这些接口没有生成,因此依赖于它们的所有公共类都无法绑定。

Java 类:

abstract interface Bitmap

   ~~~ (methods removed)

api.xml:

<interface abstract="true" deprecated="not deprecated" final="false" name="Bitmap" static="false" visibility="">

如您所见,此接口的 visibility 未设置为 public,因此不会生成 C# 代码,但开始生成依赖于此接口的公共类:

public partial class DrawableDesign : global::Com.Sushi.Hangover.IBitmap 

绑定知道接口,因为它将接口名称从Bitmap 转换为IBitmap

有什么方法可以强制创建这些接口,而无需返回 Java 代码并将这些接口更改为 public 以将它们作为visibility="public" 放入api.xml

注意:我使用的是稳定频道(Xamarin.Android 版本:6.0.3.5),因为此客户端没有 Alpha/Beta 访问权限

【问题讨论】:

你能在我可以玩的地方贴一个示例 jar 吗?自从我使用 Java 和打包 jar 以来已经太久了。 @Cheesebaron 感谢您的提议。来自客户合作伙伴的封闭源代码。他们最近对源代码进行了重大更改,并破坏了 metadata/enummethods/enumfields 文件(250 多行转换让我第一次眼花缭乱......)。客户正在回滚到 Xamarin.Android 的旧(工作)版本及其 Java 代码,以便将客户更改发布到 Google Play...:-/ 【参考方案1】:

我已经写了一个关于这个主题的小指南,可能在某些领域有所帮助:https://gist.github.com/JonDouglas/dda6d8ace7d071b0e8cb

简而言之,您可以尝试像@Cheesebaron 已经提到的那样更改可见性:https://gist.github.com/JonDouglas/dda6d8ace7d071b0e8cb#class-visibility(将 /class 替换为接口或读取公共路径)

否则您可能会尝试从头开始添加节点:https://gist.github.com/JonDouglas/dda6d8ace7d071b0e8cb#adding-types

要获得更准确的答案,我相信我们需要查看各自的 .jar/.aar 和当前的 Bindings 项目。

【讨论】:

Sweet, "Awesome gist" ;-) &lt;add-node&gt; 有效(仍然不确定为什么通过 attr 设置可见性在这种情况下不起作用,我以前用过)我已经通过add-node 完成了 3 个接口,并让其中一个主要类再次正确绑定,它在 Android 应用程序中运行良好,只有 52 个:-/(我已经有 sharpie 等效库工作所以至少今天没有对 ObjC 大发雷霆)。不确定客户要做什么(他们的预算很紧),但至少他们有一个工作选项,如果需要可以使用。再次感谢。 您是否确保该节点被相应的命令检测/命中? (诊断构建输出是你的朋友)。类似“没有匹配的节点”的消息表示失败。 是的......类的 xpath 没有问题......它在较旧的 .jar 和较旧的 Xamarin 版本中运行良好。这个新的.jar 有一堆新的参考.jars 当然我必须添加,使用更新的JDK/javac,但是.jar 反编译很好,他们现在使用extends 其他的接口,但我绑定其他这样做的罐子......好吧,无论如何它几乎是成人饮料时间;-) 嗯,在这种情况下可能还有其他事情发生。 (即 JDK 版本、API 级别、参考等)。无论如何,如果&lt;add-node&gt; 是最简单的解决方法,那么它可能是下午 5 点……【参考方案2】:

在 Transforms/Metadata.xml 文件内的绑定库中,您可以通过添加以下行来更改可见性:

<attr path="/api/package[@name='com.sushi.hangover']/interface[@name='IBitmap']" name="visibility">public</attr>

鉴于Java世界中的包名是com.sushi.hangover,接口名是IBitmap

您可以阅读更多关于format of attr in the GAPI mono documentation. 的信息,还有一些不错的bindings documentation in the Xamarin Docs。

【讨论】:

谢谢,只是试了一下,没有变化,仍然不能生成基于C#的接口类,我通过GAPI多次;-)

以上是关于未生成 Java 绑定抽象类的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 抽象类

java早期绑定的关键词都有哪些

Java面向对象-抽象类

抽象的通用 ODataController 类导致“未找到 HTTP 资源”

java基础()之抽象类和抽象函数

关于java抽象方法