在Go中将C.jstring转换为本机字符串

jar*_*ope 11 c java java-native-interface android go

如何在Go中将C.jstring转换为可用的字符串?

我正在使用GoAndroid.

在C中,您可以执行类似此stackoverflow线程中的操作

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString)   
{
   const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0);

  // use your string

  (*env)->ReleaseStringUTFChars(env, javaString, nativeString);
}
Run Code Online (Sandbox Code Playgroud)

在Go它开始看起来像这样

func Java_ClassName_MethodName(env *C.JNIEnv, clazz C.jclass, jstring javaString) {
    defer func() {
        if err := recover(); err != nil {
           log.Fatalf("panic: init: %v\n", err)
       }
   }()
   // ???
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*i G 0

如果我是你,我会寻找 Java 到 C 字符串,然后使用标准 C 字符串到 Go 字符串。

我会考虑编写一个 C 函数,将 Java 字符串转换为 C 字符串并将其返回到 Go 运行时。

C 到 GoString:

b := C.malloc(50)
defer C.free(unsafe.Pointer(b))
C.callToCFunction(PChar(b), 50)
rs := C.GoString(PChar(b))
return rs, err
Run Code Online (Sandbox Code Playgroud)

Java 有自己的内存管理,因此应该有自己的方式将数据移动到 C 中。您可以使用 Java JNI 关键字来询问。

您在一个进程中使用 Java 和 Go 运行时。这可能会产生一些副作用。