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 關注
- 222 瀏覽
添加回答
舉報