2012-12-06 42 views
1

使用JNA,我加載C語言編寫的一個dll ++和℃以內調用本函數++函數:JNA:字符數組作爲函數參數

int xxfunction(Char* ptr){...} 

在這裏,我需要發送一個字符數組,這樣的功能將分配對它的價值。基本上我需要通過引用傳遞char數組。

按照JNA文檔,C++ char*等效在Java是String,所以我創建字符串對象,並它傳遞給函數等如下所示:

Java函數聲明:

interface foo extends Library 
{ 
....//loading dll and other work 
    int xxfunction(String chararray);//function declaration 
} 

Java函數調用:

public static void main(String args[]) 
{ 
String str="abcd"; 
int i=fooinstance.xxfunction(str);//function call 
} 

但是當我執行該代碼它給我:

一個致命的錯誤已被Java運行時環境檢測: 無法寫入核心轉儲。在默認情況下,默認情況下未啓用小型轉儲器 Windows的客戶端版本

崩潰發生在Java虛擬機的本機代碼之外。查看有問題的框架報告錯誤的位置。

那麼它是正確的方式來傳遞字符串作爲參數,其中函數期望字符指針? 在java中的C++ char等價物是字節,所以我需要傳遞字節數組作爲參數嗎?

我甚至不能通過指針對象從JNA運行,因爲它給了我IllegalargumentException

回答

3

只有const char*應該映射到Java String。如果存在任何可能性而不是const,則應改爲傳遞緩衝區(byte[],Memory或NIO緩衝區),然後在「返回」值上使用Native.toString()

作爲一種風格,您應該始終向被調用者提供所提供緩衝區的長度,以便它具有足夠的信息以避免覆蓋緩衝區。

+0

感謝您的回覆,是的C++函數參數不是'const char *'它只是'char *',所以根據您的建議我試圖傳遞'byte []',甚至'Memory'也是它給我的**'byte [] primitivebytearray = new byte [256];''int i = fooinstance.xxfunction(primitivebytearray);''String str = new String();' 'Memory mem = new Memory(257);' 'mem.setString(0,str);''i = fooinstance.xxfunction(mem);' –

+1

您的本地代碼正在向傳入緩衝區寫入超過256-257個字符,或者其他問題。無論是儀器/記錄您的本機代碼執行,或附加一個調試器,以捕捉源頭的崩潰。 – technomage

+0

沒有它不超過256個字符,我試圖將所有其他可能的數據類型也傳遞給該函數,但它給出了相同的錯誤。所以我應該發送什麼參數在java中使它與C++中的char *兼容?在JNA中沒有辦法做到這一點?我無法附加記錄的文件,因爲我的公司不允許訪問任何共享網站 –