【问题标题】:Pass JNIEnv or Context from Java to Go将 JNIEnv 或 Context 从 Java 传递给 Go
【发布时间】:2018-05-03 22:41:32
【问题描述】:

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

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

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

这里看起来有点复杂:

  1. Go Mobile 似乎根本不使用 JNIEnv。
  2. Lo​​adJNI.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 也讲了不过下面的代码sn -p

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)

在 C 语言中,我使用编译器指令解决了这个问题:#cgo CFLAGS: -I...

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

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

【问题讨论】:

  • gobind 文档中的反向绑定代码应该使用gomobile 工具编译,而不是直接使用 Go 编译器。

标签: android go jnienv gomobile


【解决方案1】:

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

基本设置

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

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

如何发展

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

缺少 gobind

原来安装过程忽略了构建gobind。运行go install golang.org/x/mobile/cmd/gobind

我卡住了

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

更多...

【讨论】:

  • 我也有同样的问题。 build.gradle 在哪里?它是来自 golang 项目的绑定,对吗?为什么会有 build.gradle 文件进行绑定?
  • 我确信这是一个已死的项目,但我刚刚检查了一下,它还非常活跃。我认为你最好的选择是 github 项目页面或一个新问题。
  • 现在,我想我会等待任何其他工作示例。对于我的问题,我已经有了另一种解决方法,所以现在不需要使用反向绑定。
猜你喜欢
  • 1970-01-01
  • 2019-05-08
  • 2018-12-31
  • 2021-09-13
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多