2012-03-02 344 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。