java - BindingGenerator - 构建时出现语法错误
问题描述
我正在尝试构建一个绑定库(.AAR 绑定)并不断收到错误,如下所示:
1>BINDINGSGENERATOR : error (37: 14): 语法错误,预期:#PCDATA, , , , , {@code, {@docRoot}, {@inheritDoc}, {@link, {@linkplain, {@literal, { @value},{@value,UnknownHtmlElementStart,@author,@apiSince,@deprecated,@deprecatedSince,@exception,@param,@return,@see,@serialData,@serialField,@since,@throws,@[unknown] , @版本
要复制问题,请按照绑定 .AAR的步骤操作。
文件、.AAR
文档和来源来自Gecko Nightly Build geckoview-nightly-90.0.20210420095122.aar
,geckoview-nightly-90.0.20210420095122-javadoc.jar
并且 geckoview-nightly-90.0.20210420095122-sources.jar
目标框架:(Android 10.0(Q)
我也尝试过 9.0,没有运气)
*这是我得到的错误的屏幕截图,除了错误之外别无其他BINDINGSGENERATOR
。
从文件构建绑定库时,有没有其他人遇到过此类问题.AAR
?
编辑评论
版本信息
- VS 版本:16.10.4
- Xamarin.Android.SDK 版本:11.3.0.4
- Xamarin 版本:16.10.000.234
重现步骤
- 创建一个新项目(Android Bindings Library Xamarin C#)
- 导航到Mozilla Maven并下载
geckoview-nightly-93.0.20210823092315.aar
,geckoview-nightly-93.0.20210823092315-sources.jar
和geckoview-nightly-93.0.20210823092315-javadoc.jar
文件。 - 将这 3 个文件移动到
Jars
目录并将它们包含在项目中(您可能需要通过文件属性取消阻止文件)。这是我的Jars
目录的样子: - 为文件设置构建操作如下:
javadoc.jar
=>JavaDocJar
sources.jar
=>JavaSourceJar
和.aar
=>LibraryProjectZip
- 重建解决方案(您应该看到至少 5 个错误),例如:
BINDINGSGENERATOR : Syntax error
沿着这些思路。
解决方案
所以我花了一些时间让绑定为此工作。我将以下内容添加到 Metadata.xml 文件以使其绑定。
<metadata>
<remove-node path="/api/package[contains(@name,'org.mozilla.thirdparty')]" />
<remove-node path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/field[@name='mWindow']" />
<remove-node path="/api/package[@name='org.mozilla.geckoview']/class[@name='RuntimeSettings.Builder']/method[@name='newSettings' and count(parameter)=1 and parameter[1]]" />
<!-- Because of interfaces contain const fields Xamarin generate abstract classes, which clash with property name. Renaming properties -->
<attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='getHistoryDelegate' and count(parameter)=0]" name="propertyName">SessionHistoryDelegate</attr>
<attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='setHistoryDelegate' and count(parameter)=1 and parameter[1][@type='org.mozilla.geckoview.GeckoSession.HistoryDelegate']]" name="propertyName">SessionHistoryDelegate</attr>
<attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='getNavigationDelegate' and count(parameter)=0]" name="propertyName">SessionNavigationDelegate</attr>
<attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='setNavigationDelegate' and count(parameter)=1 and parameter[1][@type='org.mozilla.geckoview.GeckoSession.NavigationDelegate']]" name="propertyName">SessionNavigationDelegate</attr>
<attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='getPermissionDelegate' and count(parameter)=0]" name="propertyName">SessionPermissionDelegate</attr>
<attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='setPermissionDelegate' and count(parameter)=1 and parameter[1][@type='org.mozilla.geckoview.GeckoSession.PermissionDelegate']]" name="propertyName">SessionPermissionDelegate</attr>
<attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='getSelectionActionDelegate' and count(parameter)=0]" name="propertyName">SessionSelectionActionDelegate</attr>
<attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='setSelectionActionDelegate' and count(parameter)=1 and parameter[1][@type='org.mozilla.geckoview.GeckoSession.SelectionActionDelegate']]" name="propertyName">SessionSelectionActionDelegate</attr>
</metadata>
remove-node
可以解释为:
- 首先
remove-node
删除一些您无论如何都不会使用的内部组件。所以不需要为此创建绑定。 - 第二个删除由于
mWindow
某种原因公开暴露的字段。我刚刚删除了它,我们也可以更改可见性。 - 第三个我不是 100% 确定如何解决。该类
RuntimeSettings
包含在生成的代码中与构建器NewSettings
不同的方法。RuntimeSettings
我只是选择删除它。 - 生成的属性名称的重命名是由于 Java 8 的特性,您可以
static
在 Java 的接口中拥有字段。这将在生成的代码中生成一个抽象类。此类名称与为这些委托的 Setter/Getter 生成的属性名称冲突。
这使得绑定构建。然后,我在 MainActivity 中添加了一个带有以下代码的简单示例项目,以在屏幕上显示一些内容:
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
var geckoView = new GeckoView(this);
geckoView.LayoutParameters = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent);
SetContentView(geckoView);
var session = new GeckoSession();
GeckoRuntime runtime = GeckoRuntime.Create(this);
session.Open(runtime);
geckoView.Session = session;
session.LoadUri("https://blog.ostebaronen.dk");
}
}
一切都建立了,但现在它在运行时崩溃,声称丢失org.yaml.snakeyaml.constructor.Constructor
。不确定这个 aar 是否需要一些额外的依赖,需要在绑定时添加。
编辑:
我检查了您链接到的 GeckoView 版本的 POM,没有 SnakeYAML 的痕迹。但是,找到的最新版本 (93.0.20210825095400) 确实有它:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.24</version>
</dependency>
它还具有运行时需要的其他一些依赖项。在绑定项目中安装以下 NuGet 包:
- Xamarin.AndroidX.Annotation
- Xamarin.AndroidX.Legacy.Support.V4
- Xamarin.AndroidX.Lifecycle.Extensions
此外,下载.jar
SnakeYAML 1.24(android 版本)的文件并添加为EmbeddedReferenceJar
:https ://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/
完成此操作后,它运行!
推荐阅读
- c# - 在 C# 中发送 HTTP 请求失败
- reactjs - 单击按钮时输入未更新
- jquery - HTML5 JQuery - 发布前加密游戏分数?
- wordpress - WordPress 多站点子站点 WP 管理员不工作
- c# - 使用python将音频文件发送到api
- jquery - JQuery Uncaught TypeError: $(...).resizable is not a function
- python - 索引大型json时出现python elasticsearch超时错误
- php - 删除链接文本mysql的最后一部分
- c# - 在 .NET Standard 上实现异步返回类型
- sql - 我需要一个包含前几行总和的新行