使用 cgo 从 Go 返回 String[]

我必须从 Java 调用 Go 函数。我正在使用cgo和JNA这样做。


Go 例程唯一要做的就是分配内存并返回一个char**. 从 Java 方面,我收到了文档中提到的char**使用。String[]


以下是 C 助手和 Go 函数的详细信息:


static char** cmalloc(int size) {

    return (char**) malloc(size * sizeof(char*));

}


static void setElement(char **a, char *s, int index) {

    a[index] = s;

}


//export getSearchKeysA

func getSearchKeysA() **C.char {

    set_char := C.cmalloc(1)

    defer C.free(unsafe.Pointer(set_char))

    C.setElement(set_char, C.CString("hello world"), C.int(0))

    return set_char

}

Java方面:


String[] getSearchKeysA();

我得到的错误是:


#

# A fatal error has been detected by the Java Runtime Environment:

#

#  SIGSEGV (0xb) at pc=0x00007fff6b15323e, pid=92979, tid=0x0000000000000c07

#

# JRE version: Java(TM) SE Runtime Environment (8.0_192-b12) (build 1.8.0_192-b12)

# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.192-b12 mixed mode bsd-amd64 compressed oops)

# Problematic frame:

# C  [libsystem_kernel.dylib+0x723e]  __pthread_kill+0xa

#

# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again

#

# An error report file with more information is saved as:

# /Users/dfb3/datafabric/pocs/go-java-connector/hs_err_pid92979.log

#

# If you would like to submit a bug report, please visit:

#   http://bugreport.java.com/bugreport/crash.jsp

# The crash happened outside the Java Virtual Machine in native code.

# See problematic frame for where to report the bug.

#

我注意到的是,当 malloc 分配内存时会出现问题。

我已经尝试过从方法中ulimit -c unlimited删除和删除defer C.free(unsafe.Pointer(set_char))

错误的原因可能是什么,我该如何解决?有没有其他方法可以[]string从 Go 中返回 a 使用JNA

由于错字和基于@PeterSO 的答案而更新:

  1. 我最初写的是 malloc(0) 但它应该是 malloc(1)

  2. func C.CString(string) *C.char,它应该为我分配内存,不是吗?


蝴蝶不菲
浏览 339回答 2
2回答

DIEA

我终于可以String[]从GOusing中返回 a 了cgo。我将留下函数签名://export getSearchKeysfunc getSearchKeys(numKeysByReference *C.int) **C.char {  *numKeysByReference = // ... some value  // Using the C helper defined above  set_char := C.cmalloc(*numKeysByReference)  // Logic allocating and populating C.char[i .. *numKeysByReference]  // ...  return set_char}在使用,创建**C.char结构后,我收到如下数据:cgoJavaIntByReference intByReference = new IntByReference();PointerByReference array = lib.getSearchKeys(intByReference);String[] results = array.getPointer().getStringArray(0, intByReference.getValue());正如@PeterSO 提到的,我们defer C.free()在使用它后打电话。否则,它会在返回后被释放。

哈士奇WWW

你写:func getSearchKeysA() **C.char {    set_char := C.cmalloc(0)    defer C.free(unsafe.Pointer(set_char))    C.setElement(set_char, C.CString("hello world"), C.int(0))    return set_char}这可能执行为:func getSearchKeysA() (retval **C.char) {    set_char := C.cmalloc(42)    C.setElement(set_char, C.CString("hello world"), C.int(1))    retval = set_char    C.free(unsafe.Pointer(set_char))    return retval}你是指set_char之后free吗?2019 年 7 月 31 日的 Go 编程语言规范版本延迟语句“defer”语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻,要么是因为周围函数执行了一个 return 语句,到达了它的函数体的末尾,要么是因为相应的 goroutine 正在恐慌。你写:set_char := C.cmalloc(0)static char** cmalloc(int size) {    return (char**) malloc(size * sizeof(char*));}$ 人 mallocmalloc() 函数分配 size 个字节并返回一个指向已分配内存的指针。内存未初始化。如果 size 为 0,则 malloc() 返回 NULL 或稍后可以成功传递给 free() 的唯一指针值。为什么分配大小 0(零)?malloc内存未初始化。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go