在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

注意事项:

  1. 导出的Go函数必须使用//export注释
  2. 函数名首字母必须大写
  3. 支持的数据类型:基本类型、string、byte slice、map、slice
  4. 编译时需要Android SDK和NDK

这种方法通过gomobile生成JNI桥接代码,实现了Go和Java之间的双向调用。

回到顶部