2012-03-02 191 views
2
DllExport void LoadString(char *myStr) 
{ 
    cout << "Before: " << myStr << endl; 
    LoadStringData(&myStr); 
    cout << "After:" << myStr << endl; 
} 

,这在Java中:JNA传递的char *通过参考

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
DllExport void LoadString(char **myStr) 
{ 
    cout << "Before: " << *myStr << endl; 
    LoadStringData(myStr); 
    cout << "After:" << *myStr << endl; 
} 

应该更好地工作,通过一个参照存储器(字符* ),而不是存储它的自我(炭),这样,您的更改,使其恢复到Java。