我有这样的JNA接口:
interface JJ {
String Hello(GoString.ByValue sql);
}
Go中相应的本机代码:
//export Hello
func Hello(ss string) *C.char {
s := ss + " world"
return C.CString(s)
}
本机代码返回指向字符串的指针。
JNA代码是否释放本机代码分配的字符串的指针?如果没有,如何释放它?
我将回答一般性问题和具体示例。
JNA不会维护对本机内存的任何引用,除非您在JNA中自行分配(例如,定义要传递给函数的byte[]
数组或Memory
缓冲区)。在这些情况下,当垃圾回收Java对象时,将释放本机内存。
如果没有将任何内存传递给C来填充,JNA不会对本机内存做任何事情,并且您必须阅读API文档,以了解释放本机字符串的责任。
对于您的特定示例,the docs说:
Go的内存不知道由C代码进行的内存分配经理。使用C.CString(或任何C内存)创建C字符串时分配),您必须记住在完成后释放内存通过调用C.free来实现。