2011-06-15 65 views
3

我使用JNA來訪問一個DLL,一切工作正常......而我在調試!!!JNA指針檢索值

問題是當我在非調試模式下運行我的java代碼。

dll的目的是通過在一個字符串中傳遞somme參數來調用,並用結果填充一個char指針。

所以要在java中檢索結果我使用的是PointerByReference對象。 當我在調試時沒有問題,我得到了正確的結果,但在標準運行過程中,我的結果中只有一個字符。

這是我的Java調用:

PointerByReference EXMES = new PointerByReference(); 
PointerByReference SCHAINE = new PointerByReference(); 
DoubleByReference dateDujour = new DoubleByReference(DATEJOUR); 

log.debug(String.format("Appel avec les arguments : ECHAINE=[%s]; DATEJOUR=[%s]", echaine, sdf.format(dateEngagement))); 

Map<String, Object> options = new HashMap<String, Object>(); 
options.put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.ASCII); 

log.error(String.format("Default Charset : [%s]", Charset.defaultCharset().displayName())); 
Native.setProtected(true); 
MyNativeLibrary library = (MyNativeLibrary) Native.loadLibrary("myLib", MyNativeLibrary.class, options); 
library = (MyNativeLibrary) Native.synchronizedLibrary(library); 

String chaineAscii = new String("DATE_NAISSANCE\n19780102\nMEDIA\n4\n".getBytes(Charset.forName("US-ASCII"))); 

log.error(String.format("ECHAINE [%s]", chaineAscii)); 

library.SATINTS(chaineAscii, SCHAINE, dateDujour, EXMES); 

String chaineSortie = new String(SCHAINE.getPointer().getString(0, false).getBytes(Charset.forName("US-ASCII"))); 
String chaineExmes = new String(EXMES.getPointer().getString(0, false).getBytes(Charset.forName("US-ASCII"))); 

log.debug(String.format("Retour taille Prexis : SCHAINE=[%d]; EXMES=[%d]", chaineSortie.length(), chaineExmes.length())); 
log.debug(String.format("Retour Prexis : SCHAINE=[%s]; EXMES=[%s]", chaineSortie, chaineExmes)); 

這是我的C函數摘錄:

#define PRX_ALPHA char 
#define EALPHA PRX_ALPHA * 
#define SALPHA PRX_ALPHA * 

EALPHA CHAINE; 
SALPHA SCHAINE; 
EDATE DATEJOUR; 
SALPHA EXMES; 

int winapi myFunction(
CHAINE, 
SCHAINE, 
DATEJOUR, 
EXMES 
) { 


// Do something with the CHAINE and DATEJOUR then fill SCHAINE and EXMES with an answer 
to my call 

Thnaks提前爲每個幫助,我又立刻陷入

回答

7

PointerByReference是相當於C中的void **。這不是而是與您的本機函數原型相匹配。

String相當於const char*。您的本地代碼對該參數指向的內存所做的任何更改都將被忽略。如果您想爲您的本機代碼提供一個填充緩衝區,請使用byte[]Memory

Memory.getString(0)Native.toString(byte[])然後可以用於從結果中構建Java String,而不是您的較爲詳細的String構造函數。

+0

感謝您的回答,它解決了我的問題 – user799254 2011-07-15 07:48:36