JNA Pass char *参考

时间:2012-03-02 16:00:14

标签: java c++ c jna

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会关心这里的区别。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

DllExport void LoadString(char **myStr)
{
    cout << "Before: " << *myStr << endl;
    LoadStringData(myStr);
    cout << "After:" << *myStr << endl;
}

应该更好地传递对内存(char * )的引用而不是它自己的内存(char ),这样你的更改就会使它回到Java。