将JNIEnv或Context从Java传递给Go

问题描述 投票:1回答:1

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

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

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

这里似乎变得复杂了:

  1. Go Mobile似乎根本不使用JNIEnv。
  2. LoadJNI.java确实有一个上下文对象,并声称将它传递给Go端。但它在那里是不可见的。
  3. 我已经能够使用“C”指令包含jni.h
  4. 我可以从JNI / C转移JNIEnv或将其作为全局变量存储在那里,但这是一个丑陋的kludge。
  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)

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

但我不确定如何为Java做这件事

简而言之,我现在卡住了,并希望得到帮助。理想情况下,如果可能的话,我只想将对象作为参数传递。但是,我决定使用任何反向绑定来从Go调用Java。

android go jnienv gomobile
1个回答
0
投票

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

基本设置

编辑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等内容也会失败。

更多......

© www.soinside.com 2019 - 2024. All rights reserved.