3

我已经成功编写了一个 go 移动库并从一个 Android Java 应用程序中使用它。

我还成功地从 JNI 调用了 ac 函数。这个有 JNIEnv 指针。

我想将上下文/JNIEnv 从 Java 传递给 Go。

这似乎变得复杂了:

  1. Go Mobile 似乎根本不使用 JNIEnv。
  2. LoadJNI.java 确实有一个上下文对象,并声称将其传递给 Go 端。但是那里是不可见的。
  3. 我已经能够使用“C”指令包含 jni.h
  4. 我可以从 JNI/C 传输 JNIEnv 或将其作为全局变量存储在那里,但这是一个丑陋的组合。
  5. https://github.com/golang/go/issues/16876谈到了做反向绑定的提议,但目前尚不清楚状态是什么。
  6. https://godoc.org/golang.org/x/mobile/cmd/gobind也谈到了它,但下面的代码片段

import "Java/java/lang/System" t := System.CurrentTimeMillis()

返回

cannot find package "Java/java/lang/System" in any of:
/usr/local/go/src/Java/java/lang/System (from $GOROOT)
/Users/----/go/src/Java/java/lang/System (from $GOPATH)

在 CI 中使用编译器指令解决了它:#cgo CFLAGS: -I...

但我不确定如何为 Java 做到这一点

简而言之,我现在陷入困境,希望得到帮助。理想情况下,如果可能的话,我只想将对象作为参数传递。但是,我愿意接受任何反向绑定以从 Go 调用 Java。

4

1 回答 1

0

我讨厌回答我自己的问题,但我也讨厌有人经历这个问题。我会随着我的进展更新这个答案。

基本设置

编辑 build.gradle 并添加 GOPATH 和 GO 到 gobind(加粗):

gobind {
    pkg = ".../reverse/reverse"
    GOPATH = "/Users/johndoe/go"
    GO = "/usr/local/go/bin"
}

如何发展

  1. 从相反的例子开始。让它编译并运行。
  2. 进行一项修改并重新编译。

失踪的戈宾德

事实证明,安装过程忽略了构建 gobind。跑go install golang.org/x/mobile/cmd/gobind

我卡住了

试图修改反向项目来做除了它已经在做的事情之外的任何事情都是失败的。甚至像传递对象和调用 toString 这样的事情也会失败。

更多来...

于 2017-12-14T04:50:41.520 回答