在Android中使用Golang代码的方法

在Android中使用Golang代码的方法 如何在 Android 中使用 Go 代码

将 Go 代码作为共享对象在 Android 中复用。

12 回复

如果你有答案请回复。不要追踪我

更多关于在Android中使用Golang代码的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我的问题问错了吗?还是没人知道答案

他在 Rust 用户论坛上也提出了完全相同的问题,也许我们可以从那里的讨论中获得一些额外的见解?

这不是态度问题。我保留我的关切。

你好,

如果使用QML和JavaScript,我们必须在Android上使用Web视图,而这正是我们想要避免的。

这是一个非常简单的想法。如果我用 Rust 或 Bilang 编写任何代码,可以在 Android 中将其用作共享对象,那对我们将会非常有用。我们也可以在桌面或 Web 应用程序中使用相同的代码。

你好。 这可能不是你要找的答案……

我使用Golang编写Android应用程序的方式是使用QT QML

应用程序的后端使用Golang编写。 前端使用QML和JS。

我不是在追踪,只是想对你模糊的问题做些澄清,而且我正好是两个论坛的读者。

你在 Rust 论坛那边提到想要重用对象。但你具体指的是什么意思呢?

你是有某个服务器通过定义的协议发送对象吗?还是说你在移动设备上有两个程序需要共享数据?

感谢您的回答。

我们可以在 Rust 中创建共享库。它会生成类似(dll)demo.so 的 .so 文件

我们可以在 Android 中加载它

package com.you;

public class MyNativeActivity extends android.app.NativeActivity {

    static {
       System.loadLibrary("demo.so");
    }
}

这是一份很酷的QML教程

这是QML与Golang桥接的示例

这很棒…但我理解每个人都需要不同的东西。 我猜你是对的。

我不知道QML使用WebView。可能是用于渲染和JavaScript。

你可以通过HTTP或静态方式加载组件。

抱歉我的英语不好…我更能理解代码 🙂

要在 Android 中使用 Go 代码,可以通过将 Go 代码编译为共享库(.so 文件),然后在 Android 应用中通过 JNI(Java Native Interface)调用。以下是具体步骤和示例代码。

1. 编写 Go 代码并编译为共享库

首先,创建一个 Go 文件,例如 main.go,并使用 cgo 导出函数。确保函数名遵循 C 的导出规则(使用 //export 指令)。

示例 Go 代码:

package main

import "C"
import "fmt"

//export Add
func Add(a, b int) int {
    return a + b
}

//export Greet
func Greet(name *C.char) *C.char {
    msg := fmt.Sprintf("Hello, %s!", C.GoString(name))
    return C.CString(msg)
}

func main() {
    // 空 main 函数,用于编译共享库
}

编译为 Android 可用的共享库(假设目标架构为 ARM64):

GOOS=android GOARCH=arm64 CGO_ENABLED=1 go build -buildmode=c-shared -o libgocode.so main.go

这将生成 libgocode.so 和头文件 libgocode.h

2. 在 Android 项目中集成共享库

将生成的 libgocode.so 文件放入 Android 项目的 app/src/main/jniLibs/arm64-v8a/ 目录(对应架构)。如果支持多种架构,需分别放置。

3. 创建 JNI 包装器

在 Android 项目中,创建一个 Java 类来加载共享库并声明原生方法。

示例 Java 代码:

public class GoBridge {
    static {
        System.loadLibrary("gocode"); // 加载 libgocode.so
    }

    // 声明原生方法,对应 Go 中的导出函数
    public static native int Add(int a, int b);
    public static native String Greet(String name);
}

4. 在 Android 代码中调用 Go 函数

在 Activity 或其他组件中,直接调用 GoBridge 类的方法。

示例 Android Activity 代码:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 调用 Go 函数
        int result = GoBridge.Add(3, 5);
        String message = GoBridge.Greet("Android");

        // 显示结果
        TextView textView = findViewById(R.id.text_view);
        textView.setText("Add result: " + result + "\nGreeting: " + message);
    }
}

注意事项:

  • 确保 Go 工具链支持 Android 交叉编译(需设置 GOOS=android 和合适的 GOARCH)。
  • 在 Go 代码中,使用 C.CString 创建的字符串需在适当时候调用 C.free 释放,以避免内存泄漏。但在此简单示例中,未处理释放,实际生产代码需添加。
  • 如果 Go 代码复杂,需处理线程、回调等,建议使用 gomobile 工具简化流程(但问题指定使用共享对象方式)。

通过以上步骤,即可在 Android 应用中成功调用 Go 代码。

回到顶部