2 回答
TA贡献1871条经验 获得超13个赞
的返回类型是指针:。C.CString()*C.char
通过将其直接映射到 Java 端的 a,您将失去对该本机指针的跟踪,从而无法在以后跟踪和释放它。String
最直接的解决方案是将其映射到Java端。在界面中:Pointer
Pointer MyFunction(String str);
void Free(Pointer str);
然后使用它:
Pointer pMsg = MyLib.INSTANCE.MyFunction(str);
System.out.println(pMsg.getString(0));
MyLib.INSTANCE.Free(pMsg);
在这种情况下,(8 位)字符数组也可能有效。就个人而言,我可能会将类型安全指针与一些面向对象的帮助器方法一起使用,例如:byte[]
class CStringPtr extends PointerType {
public CStringPtr(String str) {
super(MyLib.INSTANCE.MyFunction(str));
}
public String getString() {
return this.getPointer().getString(0);
}
public void free() {
MyLib.INSTANCE.Free(this.getPointer());
}
}
这将使你的代码:
CStringPtr pMsg = new CStringPtr(str);
System.out.println(pMsg.getString());
pMsg.free();
TA贡献1829条经验 获得超6个赞
根据DanielWiddis的评论,我想出了以下解决方案,该解决方案可以成功为所有涉及的对象分配内存。
package main
// #include <stdlib.h>
import "C"
import (
"unsafe"
)
//export MyFunction
func MyFunction(cStr *C.char) *C.char {
str := C.GoString(cStr)
msg := str + " world"
return C.CString(msg)
}
//export Free
func Free(str *C.char){
C.free(unsafe.Pointer(str))
}
func main() {}
public interface MyLib extends Library {
MyLib INSTANCE = Native.load("mylib.so", MyLib.class);
Pointer MyFunction(Pointer ptr);
void Free(Pointer ptr);
}
public class CGoExample {
public static void main(String[] args) {
// Create pointer with a String value
String str = "Hello";
Pointer ptr = new Memory(str.length() + 1);
ptr.clear();
ptr.setString(0, str);
//Pass the pointer to Go function which returns the pointer of the message
Pointer resultPtr = MyLib.INSTANCE.MyFunction(ptr);
//Get the message String from the pointer
String msg = resultPtr.getString(0);
//Deallocate the memory for the message
MyLib.INSTANCE.Free(resultPtr);
System.out.println(msg);
}
}
- 2 回答
- 0 关注
- 189 浏览
添加回答
举报