亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從我的 Go 代碼調用 Java 本機接口 C 函數?

如何從我的 Go 代碼調用 Java 本機接口 C 函數?

Go
阿晨1998 2023-05-08 15:32:30
我準備使用 golangC庫在 Golang 中實現我的 Java 本機接口函數?,F在我想jstring使用 JNI 函數將 a 轉換為 UTF-8 字符串GetStringUTFChars,但在執行此操作時出現錯誤。這些是我完成的步驟:在我定義了 JNI 方法的 Java 類(稱為 MyClass)中,我有:public static native void print(String msg);使用,我用C 語言定義的函數javah生成了-file:.hJNIEXPORT void JNICALL Java_com_mypackage_MyClass_print  (JNIEnv *, jclass, jstring);然后,在我的 Go 代碼中,我有以下代碼:package main// #cgo CFLAGS: -I/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/include// #cgo CFLAGS: -I/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/include/darwin/*#include <jni.h>*/import "C"//export Java_com_mypackage_MyClass_printfunc Java_com_mypackage_MyClass_print(env *C.JNIEnv, clazz C.jclass, str C.jstring) {    _ = C.GetStringUTFChars(env, str, 0)}當我go使用構建文件時:go build -buildmode=c-shared -o libmyclass.dylib libmyclass.go然后我收到以下錯誤:could not determine kind of name for C.GetStringUTFChars我應該如何調用JNI 規范GetStringUTFChars中定義的,然后我可以打印字符串?fmt.println編輯 2刪除了“編輯 1”,因為上面的過程是正確的,只是沒有設置 LD_LIBRARY_PATH 變量。
查看完整描述

1 回答

?
Smart貓小萌

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 輸出文件中,所以它不能包含任何定義,只能包含聲明。


查看完整回答
反對 回復 2023-05-08
  • 1 回答
  • 0 關注
  • 222 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號