第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何從我的 Go 代碼調(diào)用 Java 本機(jī)接口 C 函數(shù)?

如何從我的 Go 代碼調(diào)用 Java 本機(jī)接口 C 函數(shù)?

Go
阿晨1998 2023-05-08 15:32:30
我準(zhǔn)備使用 golangC庫在 Golang 中實現(xiàn)我的 Java 本機(jī)接口函數(shù)?,F(xiàn)在我想jstring使用 JNI 函數(shù)將 a 轉(zhuǎn)換為 UTF-8 字符串GetStringUTFChars,但在執(zhí)行此操作時出現(xiàn)錯誤。這些是我完成的步驟:在我定義了 JNI 方法的 Java 類(稱為 MyClass)中,我有:public static native void print(String msg);使用,我用C 語言定義的函數(shù)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)}當(dāng)我go使用構(gòu)建文件時:go build -buildmode=c-shared -o libmyclass.dylib libmyclass.go然后我收到以下錯誤:could not determine kind of name for C.GetStringUTFChars我應(yīng)該如何調(diào)用JNI 規(guī)范GetStringUTFChars中定義的,然后我可以打印字符串?fmt.println編輯 2刪除了“編輯 1”,因為上面的過程是正確的,只是沒有設(shè)置 LD_LIBRARY_PATH 變量。
查看完整描述

1 回答

?
Smart貓小萌

TA貢獻(xiàn)1911條經(jīng)驗 獲得超7個贊

JNI 函數(shù)GetStringUTFChars是函數(shù)指針,不能直接從 Go 調(diào)用。您必須將所需的函數(shù)包裝在一個單獨的 C 文件中。例如


jx.c


#include <jni.h>


const char* jx_GetStringUTFChars(JNIEnv *env, jstring str, jboolean *isCopy) {

    return (*env)->GetStringUTFChars(env, str, isCopy);

}

從 C 文件創(chuàng)建庫后,您的 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() {}

包裝函數(shù)有一個單獨的 C 文件的原因是因為文檔中的這個子句:


在文件中使用 //export 對前導(dǎo)碼施加了限制:因為它被復(fù)制到兩個不同的 C 輸出文件中,所以它不能包含任何定義,只能包含聲明。


查看完整回答
反對 回復(fù) 2023-05-08
  • 1 回答
  • 0 關(guān)注
  • 234 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號