在Golang中调用Android Java代码的方法
在Golang中调用Android Java代码的方法 我们希望在 Go 语言中调用 Java 代码。
请帮助我们如何实现这一点。
3 回复
虽然从未尝试过,但JNI或许可以用于这项任务…
更多关于在Golang中调用Android Java代码的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这似乎是不可能的。 Java代码运行依赖于JVM,但Go语言以二进制形式执行。 但总有解决办法,或许你可以尝试使用cgo? 简单来说,让C语言作为Java和Go之间的桥梁。
在Golang中调用Android Java代码可以通过Go Mobile工具链实现。以下是具体实现方法:
1. 安装Go Mobile工具
go install golang.org/x/mobile/cmd/gomobile@latest
gomobile init
2. 创建Java绑定接口
创建libhello目录,添加libhello.go:
package libhello
import "C"
import "golang.org/x/mobile/bind/seq"
//export HelloFromGo
func HelloFromGo(name string) string {
return "Hello from Go, " + name + "!"
}
//export AddNumbers
func AddNumbers(a, b int) int {
return a + b
}
3. 生成Java绑定
gomobile bind -target=android -o libhello.aar ./libhello
4. Android端调用示例
在Android项目中添加生成的aar文件,然后在Java中调用:
import go.libhello.Libhello;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 调用Go函数
String result = Libhello.helloFromGo("Android");
Log.d("GoCall", result); // 输出: Hello from Go, Android!
int sum = Libhello.addNumbers(5, 3);
Log.d("GoCall", "Sum: " + sum); // 输出: Sum: 8
}
}
5. 反向调用(Java调用Go,Go回调Java)
// libhello.go - 添加回调支持
package libhello
import (
"golang.org/x/mobile/bind/seq"
)
var callback func(string)
//export RegisterCallback
func RegisterCallback(fn func(string)) {
callback = fn
}
//export TriggerCallback
func TriggerCallback() {
if callback != nil {
callback("Callback from Go")
}
}
// Android端设置回调
Libhello.registerCallback(new Libhello.StringCallback() {
@Override
public void onCallback(String message) {
Log.d("GoCallback", message);
}
});
// 触发Go回调
Libhello.triggerCallback();
6. 处理复杂数据类型
//export ProcessUserData
func ProcessUserData(data map[string]interface{}) map[string]interface{} {
result := make(map[string]interface{})
result["processed"] = true
result["original_size"] = len(data)
result["timestamp"] = time.Now().Unix()
return result
}
// Java端调用
HashMap<String, Object> input = new HashMap<>();
input.put("name", "John");
input.put("age", 30);
HashMap<String, Object> output = Libhello.processUserData(input);
7. 构建配置
在Go模块的go.mod中确保包含:
require golang.org/x/mobile v0.0.0-latest
注意事项:
- 导出的Go函数必须使用
//export注释 - 函数名首字母必须大写
- 支持的数据类型:基本类型、string、byte slice、map、slice
- 编译时需要Android SDK和NDK
这种方法通过gomobile生成JNI桥接代码,实现了Go和Java之间的双向调用。

