gpt4 book ai didi

java - 在 Go 中将 C.jstring 转换为 native 字符串

转载 作者:IT老高 更新时间:2023-10-28 13:09:33 26 4
gpt4 key购买 nike

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

我正在使用 GoAndroid .

在 C 中,你可以在 this stackoverflow thread 中执行类似的操作

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);
}

在 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)
}
}()
// ???
}

最佳答案

我知道这个问题很老了,但我最近遇到了这个问题,并认为我会为在这里结束的其他人详细说明一下:

GetStringUTFChars 这样的 JNI 函数是不能直接从 Go 调用的函数指针。您必须将函数包装在单独的 C 文件中,例如:

jx.c
#include <jni.h>

const char* jx_GetStringUTFChars(JNIEnv *env, jstring str, jboolean *isCopy) {
return (*env)->GetStringUTFChars(env, str, isCopy);
}

从 C 文件创建库后,您的 Go 文件将如下所示:

package main

/*
#cgo CFLAGS: -I/usr/java/jdkX.X.X_XXX/include/ -I/usr/java/jdkX.X.X_XXX/include/linux/
#cgo LDFLAGS: -L${SRCDIR}/ -ljx

#include "jx.h"
*/
import "C"
import (
"fmt"
)

//export Java_com_mypackage_MyClass_print
func Java_ClassName_MethodName(env *C.JNIEnv, clazz C.jclass, str C.jstring) {
s := C.jx_GetStringUTFChars(env, str, (*C.jboolean)(nil))
fmt.Println(C.GoString(s))
}

func main() {}

之所以有一个单独的 C 文件只是为了包装函数是因为 documentation 中的这个子句。 :

Using //export in a file places a restriction on the preamble: since it is copied into two different C output files, it must not contain any definitions, only declarations.

关于java - 在 Go 中将 C.jstring 转换为 native 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24995953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com