2011-06-15 67 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