- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我将构建一个将字符串传回 Java 的 Go 共享对象二进制文件(.DLL 和 .so)。为了计算从 Go 传递的 C 字符串,我写了这个:
package main
/*
#include <stdlib.h>
*/
import "C"
import (
"log"
"unsafe"
)
//export passBackHello
func passBackHello(buf **C.char) C.int {
str := "Hello World!"
length := len(str)
cString := C.CString(str) // returns *C.char
defer C.free(unsafe.Pointer(cString))
log.Println("In passBackHello: cString:", C.GoStringN(cString, C.int(length)))
*buf = C.CString(str) // works
*buf = cString // doesn't work
log.Println("In passBackHello: buf:", C.GoStringN(*buf, C.int(length)))
return C.int(length)
}
func main() {
buf := make([]byte, 8192) //create my buffer
cStrPointer := (**C.char)(unsafe.Pointer(&buf[0]))
defer C.free(unsafe.Pointer(cStrPointer))
lengthCint := passBackHello(cStrPointer)
log.Println("In main: length:", int(lengthCint))
log.Println("In main: buf:", C.GoStringN(*cStrPointer, lengthCint))
log.Println("In main: buf:", C.GoString(*cStrPointer))
}
当我在函数 passBackHello
中使用 *buf = C.CString(str)
时,它起作用了:
2018/03/31 19:33:54 In passBackHello: cString: Hello World!
2018/03/31 19:33:54 In passBackHello: buf: Hello World!
2018/03/31 19:33:54 In main: length: 12
2018/03/31 19:33:54 In main: buf: Hello World!
2018/03/31 19:33:54 In main: buf: Hello World!
exit status 3221226356
当我在函数 passBackHello
中使用 *buf = cStringPointer
时,它在 buf
中显示,而在 passBackHello
中显示,但不显示在 main
中:
2018/03/31 19:33:05 In passBackHello: cString: Hello World!
2018/03/31 19:33:05 In passBackHello: buf: Hello World!
2018/03/31 19:33:05 In main: length: 12
2018/03/31 19:33:05 In main: buf: ⌂3 X☺�
2018/03/31 19:33:05 In main: buf: ⌂3
exit status 3221226356
我需要让 *buf = cStringPointer
版本工作,因为那个版本有 C 字符串变量的 C.free
。我正在运行 go 版本 go1.10.1 windows/amd64。
更新
申请后Azeem的答案和一些其他清理工作的 Go 代码如下所示:
//export passBackHello
func passBackHello(cStrPointer **C.char) C.int {
str := "Hello World!"
length := len(str)
*cStrPointer = C.CString(str) // copies *C.char into caller's buffer
log.Println("In passBackHello *cStrPointer:", C.GoStringN(*cStrPointer, C.int(length)))
return C.int(length)
}
func main() {
buf := make([]byte, 8192) //create my buffer
cStrPointer := (**C.char)(unsafe.Pointer(&buf[0]))
defer C.free(unsafe.Pointer(cStrPointer))
lengthCint := passBackHello(cStrPointer)
log.Println("In main: length:", int(lengthCint))
log.Println("In main: *cStrPointer:", C.GoStringN(*cStrPointer, lengthCint))
log.Println("In main: *cStrPointer:", C.GoString(*cStrPointer))
}
为了完整起见,Java 调用程序如下所示:
// allocate a void**
final PointerByReference decCStringPointer = new PointerByReference();
// call the C function
Integer decLength = gpg.passBackHello(decCStringPointer);
// extract the void* that was allocated in C
final Pointer p = decCStringPointer.getValue();
// extract the null-terminated string from the Pointer
final String decValue = p.getString(0);
System.out.printf("decrypted length: %d\n", decLength);
System.out.printf("decrypted value: %s\n", decValue);
看起来缓冲区在C内存中。如何从 Java 中释放它?
最佳答案
根据 C.CString
的文档功能:
// Go string to C string
// The C string is allocated in the C heap using malloc.
// It is the caller's responsibility to arrange for it to be
// freed, such as by calling C.free (be sure to include stdlib.h
// if C.free is needed).
func C.CString(string) *C.char
你不需要在你的函数中释放它。它是应该释放它的调用者(即 main
函数)。
从 passBackHello
中删除 defer C.free(unsafe.Pointer(cString))
行,它应该可以工作!
注意:
您不需要那个缓冲区(即 buf
),因为它是正在返回的指针并且已经分配了内存。如果需要,您可以将其复制到缓冲区中并释放指针。
关于go - 如何将 **C.char 数据传回调用者的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49594219/
昨天开始学习ansible,所以我相信我可能会在这里冒XY问题的风险,但仍然...... 主要的yml: - hosts: localhost vars_files: [ "users.y
我在 Storyboard中创建了一些segue。它有一些标识符。我在方法 prepareForSegue:sender: 中配置 destinationViewController 并分配一些对象作
我想用 Promises 替换代码中的一些回调。 我有一个使用 setAnimationFrame 在循环中运行的模型。我想在我的模型中启动一些东西,并在完成时通知我。目前我是这样做的。 doSome
我需要动态获取用户选择的任何选项的值,并在单击按钮时将该值传递回 Facebook Pixel。 请参阅脚本区域中的所选选项值。 Wh
这个问题在这里已经有了答案: dismissModalViewController AND pass data back (4 个回答) 9年前关闭。 我有一个带有表格的popoverview,我想在
我想用 Python 显示一个 2D map ,然后在 Python 代码中用 coursor 的坐标做一些事情。但是,我无法获得 Python 部分的坐标。这是我的代码: from PyQt5.Qt
我正在使用 NXP lpc1769 演示板开发一个小项目。我正在使用 CodeRed 的 LPCExpresso 5 对其进行编程,我想知道是否可以将应用程序 hex/bin 文件从开发板传输回 PC
我是 Android 的新手,一般来说是事件驱动代码。我没有在 Activity 中嵌入大量匿名事件监听器类来处理 onClick 事件等,而是定义了单独的类以保持代码整洁。然后我使用它们,例如像这样
我已经成功地使用了 prepareForSegue,不过我已经成功地传递了变量。我现在正在尝试通过 segue 的反向传递 NSNumber 但 prepareForSegue 没有被调用。要返回到我
我有 ViewController 和 TableViewController。在 ViewController 中,我有 2 个按钮和 2 个文本字段,当单击按钮 1 时,它将导航到带有静态数据的
我如何将信息从 Jinja 模板页面传回 Flask? 假设我打印了一些项目列表。用户选择项目,我可以通过 Javascript 捕捉。 将所选项目作为参数传递给将生成该项目自己的页面的函数的最佳做法
我怎样才能将数据从 php 的然后行传回 ajax? PHP $query = 'SELECT * FROM picture order by rand() LIMIT 10'; $result =
在我的 MVC4 项目 View 中,正在传递 IEnumerable模型来查看。当我将表单提交回 Controller 时, Controller 方法的参数为 IEnumerable data 。
在我的 MVC4 项目 View 中,正在传递 IEnumerable要查看的模型。当我将表单提交回我的 Controller 时, Controller 方法的参数为 IEnumerable dat
我试图将订单 ID 从订单页面传递到 Paypal,然后返回到感谢页面,这样我就可以将订单标记为已付款,但我遇到了问题。目前我将这些变量传递给 Paypal,如下所示: $vars = array(
所以通常我会为此使用委托(delegate)模式,但这是一个棘手的情况。 View Controller A 呈现 -> View Controller B 呈现 -> View Controller
我是 Android 和 Java 的初学者。到目前为止还不错,但我偶然发现了一个我无法解决的问题。 我正在尝试在我的应用程序类中创建一个方法,该方法将使用传递给它的值对列表进行 http 调用。这是
在我的应用程序中,我使用 uitable 从我的列表中选择类别。我的任务是,当用户单击或选择一个单元格时,他应该能够在下一个 View (详细 View )中查看所选单元格的详细信息。当他在详细 Vi
我正在构建一个应用程序,当用户从 select 标签中选择一个值时,系统会提示用户使用另一个带有相应数据的 select 标签。我通过从第一个字段中获取数据并使用 Ajax 将其传回我的 Contro
我有一个 C# 应用程序需要获取从 C++ DLL 传回的可变长度数据。通常,我按如下方式解决此问题:对于每个实体类型(例如字符串或位图),我都有一个适当类型的持久 C++ 变量。然后,C# 应用程序
我是一名优秀的程序员,十分优秀!