gpt4 book ai didi

java - JNA 通过引用传递 char*

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:07 26 4
gpt4 key购买 nike

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(尽管老实说,这就像 void**),但我正在抛出我能得到的所有想法。然而上面的线程是关于传递结构,而不是 char*,但我不明白为什么 JNA 会关心这里的差异。

有什么想法吗?

最佳答案

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

应该更好地传递对内存的引用 (char*) 而不是内存本身 (char),这样您的更改就会返回到 Java。

关于java - JNA 通过引用传递 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9536387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com