JNA 通过引用传递字符*

JNA Pass char* By Reference

本文关键字:字符 引用 JNA      更新时间:2023-10-16
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 不知道这一变化。

这些线程表明我正在做的事情是正确的:

如何在 Java 中获取新的指针?

JNA 结构和指针映射

我也尝试过PointerByReference(虽然说实话,这就像是void**(,但我正在抛出我能得到的每一个想法。然而,上面的线程是关于传递结构的,而不是 char*,但我不明白为什么 JNA 会关心这里的区别。

有什么想法吗?

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

传递对内存 (char*( 的引用应该比传递它自己的内存 (char( 更好,这样您的更改就会返回到 Java。