Golang新手关于gomobile的疑惑求助

Golang新手关于gomobile的疑惑求助 我已经构建了 basic.apk 并将其安装到我的小米手机上。 在这个过程中,我遇到了 NDK22 版本的问题,在我降级其版本后,问题得以解决。 现在它运行得很好。我有一个问题,gomobile 似乎无法调用原生的 Android API 或使用像相机、Android 系统对象这样的资源,例如发送/接收消息、读取联系人信息以及关闭 Android 中正在运行的特定应用程序。您能就我的困惑分享一下您的看法吗? 我该如何使用 gomobile 来使用 Android 原生对象,例如消息、联系人、相机、Android 系统资源?

2 回复

作为一名安卓开发者,我建议直接使用安卓环境本身来调用这类API(比如Kotlin、Android Jetpack等)。如果你不想在这样缓慢的环境中工作,希望快速开发和发布,更好的方法是使用Flutter或React Native(尽管我个人不太喜欢后者)。请记住,Go在某些方面确实很棒,但对于纯粹的移动开发而言,有更出色的技术可供选择。

更多关于Golang新手关于gomobile的疑惑求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


gomobile 本身确实不直接提供访问 Android 原生 API 的能力,但你可以通过两种主要方式来实现这些功能:

  1. 使用 gomobile 的绑定功能:通过创建 Java/Android 代码的绑定,你可以在 Go 中调用原生 Android API。首先,你需要编写一个 Android Java 库,然后使用 gomobile bind 命令生成 Go 可调用的绑定。

    示例:假设你想调用 Android 的相机 API。首先,创建一个 Java 类,例如 CameraHelper.java

    package com.example.myapp;
    
    import android.content.Context;
    import android.hardware.Camera;
    
    public class CameraHelper {
        private Camera camera;
        private Context context;
    
        public CameraHelper(Context context) {
            this.context = context;
        }
    
        public void startCamera() {
            // 实现启动相机的逻辑
            camera = Camera.open();
        }
    
        public void stopCamera() {
            if (camera != null) {
                camera.release();
                camera = null;
            }
        }
    }
    

    然后,使用 gomobile bind 命令生成 Go 绑定:

    gomobile bind -target=android com.example.myapp
    

    这会在当前目录生成一个 .aar 文件。在你的 Go 代码中,你可以导入并使用这个绑定:

    package main
    
    import (
        "golang.org/x/mobile/app"
        _ "com.example.myapp" // 导入生成的绑定
    )
    
    func main() {
        app.Main(func(a app.App) {
            // 在 Go 中调用 CameraHelper 的方法
            helper := myapp.NewCameraHelper(a.Context())
            helper.StartCamera()
            // 其他操作...
        })
    }
    
  2. 使用 Go 的 C 包和 JNI:通过 Go 的 C 包,你可以直接调用 C 代码,进而使用 JNI 来调用 Android 原生 API。这种方法更底层,但更灵活。

    示例:假设你想通过 JNI 调用 Android 的消息 API。首先,在 Go 中编写一个导出到 C 的函数:

    package main
    
    // #include <jni.h>
    import "C"
    import "unsafe"
    
    //export SendMessage
    func SendMessage(env *C.JNIEnv, msg *C.char) {
        // 使用 JNI 调用 Android 的发送消息 API
        // 这里需要编写具体的 JNI 代码,例如调用 SmsManager
    }
    
    func main() {}
    

    然后,在 Android 的 Java 代码中,通过 JNI 调用这个 Go 函数:

    public class MessageHelper {
        static {
            System.loadLibrary("mylib"); // 加载包含 Go 代码的库
        }
    
        public native void sendMessage(String msg);
    }
    

    使用 gomobile 构建时,确保链接这个库。

对于读取联系人、关闭应用等操作,类似地,你可以通过绑定或 JNI 实现。例如,关闭应用可以通过调用 Android 的 Activity.finish() 方法实现。在 Java 绑定中:

public class SystemHelper {
    private Activity activity;

    public SystemHelper(Activity activity) {
        this.activity = activity;
    }

    public void closeApp() {
        activity.finish();
    }
}

然后在 Go 中调用 closeApp 方法。

总的来说,gomobile 提供了桥梁,但具体功能需要你编写原生代码并通过绑定或 JNI 集成。建议先熟悉 Android 开发,再结合 gomobile 文档进行实现。

回到顶部