未生成 Java 绑定抽象类
Posted
技术标签:
【中文标题】未生成 Java 绑定抽象类【英文标题】:Java Binding Abstract class not being generated 【发布时间】:2016-08-07 12:45:30 【问题描述】:错误 CS0234:类型或命名空间名称
IBitmap' does not exist in the namespace
Com.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" ;-)<add-node>
有效(仍然不确定为什么通过 attr
设置可见性在这种情况下不起作用,我以前用过)我已经通过add-node
完成了 3 个接口,并让其中一个主要类再次正确绑定,它在 Android 应用程序中运行良好,只有 52 个:-/(我已经有 sharpie
等效库工作所以至少今天没有对 ObjC 大发雷霆)。不确定客户要做什么(他们的预算很紧),但至少他们有一个工作选项,如果需要可以使用。再次感谢。
您是否确保该节点被相应的命令检测/命中? (诊断构建输出是你的朋友)。类似“没有匹配的节点”的消息表示失败。
是的......类的 xpath 没有问题......它在较旧的 .jar
和较旧的 Xamarin 版本中运行良好。这个新的.jar
有一堆新的参考.jar
s 当然我必须添加,使用更新的JDK/javac,但是.jar
反编译很好,他们现在使用extends
其他的接口,但我绑定其他这样做的罐子......好吧,无论如何它几乎是成人饮料时间;-)
嗯,在这种情况下可能还有其他事情发生。 (即 JDK 版本、API 级别、参考等)。无论如何,如果<add-node>
是最简单的解决方法,那么它可能是下午 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 绑定抽象类的主要内容,如果未能解决你的问题,请参考以下文章