java - JNA 通过引用传递 char*

标签 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(尽管老实说,这就像 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/

相关文章:

c++ - 如何获得禁用的 QAction 元素的触发信号?

c - 链接到 bsd/stdlib.h

c - C中的多个定时器

java - 有帮助组织我的类(class)吗?

java - 如何将csv文件中的某些数据添加到ArrayList

c++ - 实现任意精度的浮点库

c++ - Windows 上的 native 窄字符串编码是什么?

java - 如何用while循环填充数组?

java - Tomcat 不连接到数据库,但是当我从 netbeans 中运行它时,它工作得很好

c++ - CascadeClassifier.load() 仅在发布时出错