1 回答
TA贡献1911条经验 获得超7个赞
JNI 函数GetStringUTFChars是函数指针,不能直接从 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/jdk1.8.0_162/include/ -I/usr/java/jdk1.8.0_162/include/linux/
#cgo LDFLAGS: -L${SRCDIR}/ -ljx
#include "jx.h"
*/
import "C"
import (
"fmt"
)
//export Java_com_mypackage_MyClass_print
func Java_com_mypackage_MyClass_print(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 文件的原因是因为文档中的这个子句:
在文件中使用 //export 对前导码施加了限制:因为它被复制到两个不同的 C 输出文件中,所以它不能包含任何定义,只能包含声明。
- 1 回答
- 0 关注
- 164 浏览
添加回答
举报