2

尝试使用 JsInterop 通过 Javascript 与 LibGDX 项目进行通信。我在这里遵循“将 Java 类型导出到 JavaScript”示例。它不起作用:Uncaught ReferenceError 'com' is not defined。我没有得到任何错误gradle

我已经:

  1. 检查 generateJsInteropExports 是否启用:

My GdxDefinition.gwt.xml

<module rename-to="html">
  <inherits name='com.badlogic.gdx.backends.gdx_backends_gwt' />
  <inherits name='com.badlogic.gdx.physics.box2d.box2d-gwt' />
  <inherits name='myapp' />
  <entry-point class='com.mypackage.myapp.client.HtmlLauncher' />
  <set-configuration-property name="gdx.assetpath" value="../android/assets" />
  <set-configuration-property name='xsiframe.failIfScriptTag' value='FALSE'/>
  <set-configuration-property name='generateJsInteropExports' value='true'/>
  <set-property name="user.agent" value="safari"/>
</module>

我在想,也许入口点HtmlLauncher也应该是 a @JsType,但这也不起作用。

  1. 还检查了 generateJsInteropExports 是否启用GdxDefinitionSuperdev.gwt.xml

  2. 以不同的方式访问浏览器控制台中的类,例如:

.

new com.mypackage.myapp.client.Test();

new Test(); // when setting namespace to global

$wnd.Test(); // JSNI syntax

我是这样编译的:

gradlew.bat html:dist --daemon -generateJsInteropExports=true

我的课(在 html 模块中,也在核心模块中尝试过,仍然不起作用)看起来像这样:

package com.mypackage.myapp.client;

import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;

@JsType(namespace = JsPackage.GLOBAL)
public class Test {

    public String name;

    public Test(String name) {
        this.name = name;
    }


    public void sayHello() {
        return "Hello" + this.name;
    }
}

我的想法不多了。somenody 可以帮我弄清楚该怎么做才能使它起作用。

一些可能有用的信息:

我的代码html.gradle

gwt {
    gwtVersion='2.8.0' // Should match the gwt version used for building the gwt backend
   //...
    modules 'com.mypackage.myapp.GdxDefinition'
    devModules 'com.mypackage.myapp.GdxDefinitionSuperdev'
    project.webAppDirName = 'webapp'

    compiler {
        strict = true;
        disableCastChecking = true;
    }
}

import org.wisepersist.gradle.plugins.gwt.GwtSuperDev
//...
task superDev (type: GwtSuperDev) {
    dependsOn startHttpServer
    doFirst {
        gwt.modules = gwt.devModules
    }
}
//...

我的代码project gradle

buildscript {
//...
dependencies {
    classpath 'org.wisepersist:gwt-gradle-plugin:1.0.6'
   //...
    }
}

project(":html") {
    apply plugin: "gwt"
    apply plugin: "war"

    dependencies {
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion"
        compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources"
        compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources"
        compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion:sources"
        compile "com.badlogicgames.gdx:gdx-box2d-gwt:$gdxVersion:sources"
        compile "com.google.jsinterop:jsinterop-annotations:1.0.1"
    }
}

project(":core") {
    apply plugin: "java"
    dependencies {
       //...
        compile "com.google.jsinterop:jsinterop-annotations:1.0.1"

    }
}

//...

更新 1

我检查了 Colin Alworth 的答案和他发布的链接。它仍然不起作用。我变了:

html.gradle


gwt {
gwtVersion='2.8.0' // Should match the gwt version used for building the gwt backend
maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY
minHeapSize="1G"

src = files(file("src/")) // Needs to be in front of "modules" below.
modules 'com.mycompany.myapp.GdxDefinition'
devModules 'com.mycompany.myapp.GdxDefinitionSuperdev'
project.webAppDirName = 'webapp'

compiler {
    strict = true;
    disableCastChecking = true;
}

jsInteropExports {
    shouldGenerate = true
    includePatterns = ['com.mycompany.myapp.client.*']
}
}

就像这里所说那样。

我这样称呼:gradlew.bat html:dist --daemon并且我generateJsInteropExports从 GdxDefinition 文件中删除了该属性,因为它似乎是错误的。

现在我得到以下编译错误:

 Task :html:compileGwt FAILED
Unknown argument: -includeJsInteropExports

这是为什么?

4

2 回答 2

2

非常感谢@Colin Alworth,我发现了如何让它工作。

html.gradle

gwt {
  gwtVersion='2.8.0' // Should match the gwt version used for building the gwt backend
  maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY
  minHeapSize="1G"

  src = files(file("src/")) // Needs to be in front of "modules" below.
  modules 'com.mycompany.myapp.GdxDefinition'
  devModules 'com.mycompany.myapp.GdxDefinitionSuperdev'
  project.webAppDirName = 'webapp'

  compiler {
    strict = true;
    disableCastChecking = true;
  }

  // important part:
  jsInteropExports {
    shouldGenerate = true
    // breaks if I use includePatterns
  }
}

并且

  • <set-configuration-property name='generateJsInteropExports' value='true'/>从 Gdx 定义文件中删除
  • 不要在全局命名空间中为导出的类使用相同的名称(愚蠢的错误,我知道)
  • 编译调用如gradlew.bat html:dist --daemon

完美的结果:

在此处输入图像描述

于 2019-02-23T10:30:28.843 回答
1
   <set-configuration-property name='generateJsInteropExports' value='true'/>

这绝对不会产生这些出口

gradlew.bat html:dist --daemon -generateJsInteropExports=true

我不太了解 gradle 很糟糕,但我几乎可以肯定这也是错误的(至少它需要一个-P前缀,但我没有看到您共享的 gradle 文件中使用了该属性)。

相反,您需要将它传递给您的 gradle 插件,用于超级开发模式和生产编译任务。

快速浏览一下文档org.wisepersist:gwt-gradle-plugin,看起来该任务将采用 GwtJsInteropExportsOptions arg(来自http://gwt-gradle-plugin.documentnode.io/javadoc/org/wisepersist/gradle/plugins/gwt/GwtJsInteropExportsOptions。 htmlhttp://gwt-gradle-plugin.documentnode.io/javadoc/org/wisepersist/gradle/plugins/gwt/AbstractGwtActionTask.html#setJsInteropExports-org.wisepersist.gradle.plugins.gwt.GwtJsInteropExportsOptions- ),其中我有限的 gradle 经验最终会像

jsInteropExports {
  generate = true
}

看起来这可以放在gwt {}块中,旁边是compiler {}.

这是该插件跟踪器上的一个问题,它讨论了如何执行此操作https://github.com/jiakuan/gwt-gradle-plugin/issues/19

于 2019-02-23T00:29:05.243 回答