Java 检索值的指针

Java 检索值的指针,java,c,native,jna,Java,C,Native,Jna,我正在使用JNA访问dll,一切正常。。。当我在调试的时候 问题是当我在非调试模式下运行java代码时 dll的用途是通过在字符串和 用结果填充字符指针 因此,为了在java中检索结果,我使用了一个PointerByReference对象。 当我进行调试时,没有问题,我得到了正确的结果,但在标准运行过程中,我的结果中只有一个字符 这是我的java调用: PointerByReference EXMES = new PointerByReference(); PointerByReference

我正在使用JNA访问dll,一切正常。。。当我在调试的时候

问题是当我在非调试模式下运行java代码时

dll的用途是通过在字符串和 用结果填充字符指针

因此,为了在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中,指针引用相当于void**。这与您的本机函数原型不匹配

String
相当于
const char*
。本机代码对该参数指向的内存所做的任何更改都将被忽略。如果要为本机代码提供一个缓冲区来填充,请使用
byte[]
Memory

Memory.getString(0)
Native.toString(byte[])
可用于从结果构造Java
String
,而不是相当冗长的
String
构造函数

#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