在Android中使用Golang代码的方法
在Android中使用Golang代码的方法 如何在 Android 中使用 Go 代码
将 Go 代码作为共享对象在 Android 中复用。
我的问题问错了吗?还是没人知道答案
他在 Rust 用户论坛上也提出了完全相同的问题,也许我们可以从那里的讨论中获得一些额外的见解?
这不是态度问题。我保留我的关切。
这是一个非常简单的想法。如果我用 Rust 或 Bilang 编写任何代码,可以在 Android 中将其用作共享对象,那对我们将会非常有用。我们也可以在桌面或 Web 应用程序中使用相同的代码。
我不是在追踪,只是想对你模糊的问题做些澄清,而且我正好是两个论坛的读者。
你在 Rust 论坛那边提到想要重用对象。但你具体指的是什么意思呢?
你是有某个服务器通过定义的协议发送对象吗?还是说你在移动设备上有两个程序需要共享数据?
感谢您的回答。
我们可以在 Rust 中创建共享库。它会生成类似(dll)demo.so 的 .so 文件
我们可以在 Android 中加载它
package com.you;
public class MyNativeActivity extends android.app.NativeActivity {
static {
System.loadLibrary("demo.so");
}
}
这很棒…但我理解每个人都需要不同的东西。 我猜你是对的。
我不知道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 代码。


