DllExport void LoadString(char *myStr)
{
cout << "Before: " << myStr << endl;
LoadStringData(&myStr);
cout << "After:" << myStr << endl;
}
这在Java中:
Pointer myStr = new Memory(Pointer.SIZE);
System.out.println(String.format("myStr Value: %s", myStr.getPointer(0).getString(0)));
this.Lib.LoadString(myStr);
System.out.println(String.format("myStr Value: %s", myStr.getPointer(0).getString(0)));
这是输出:
myStr Value: ¸ï1
Before: Øî1
After:test
myStr Value: ¸ï1
所以我可以清楚地看到传入的垃圾指针,在C ++上重新分配(After:test),但由于某种原因,JNA并不知道这种变化。
这些主题暗示我正在做的是正确的:
How to obtain a new Pointer in Java?
JNA Struct and Pointer mapping
我也尝试过PointerByReference(尽管说实话,这就像虚空**),但我却抛出了我能想到的每一个想法。然而,上面的线程是关于传递结构,而不是char *,但我不明白为什么JNA会关心这里的区别。
有什么想法吗?
答案 0 :(得分:1)
DllExport void LoadString(char **myStr)
{
cout << "Before: " << *myStr << endl;
LoadStringData(myStr);
cout << "After:" << *myStr << endl;
}
应该更好地传递对内存(char * )的引用而不是它自己的内存(char ),这样你的更改就会使它回到Java。