如何解决JNA指针检索值
| 我正在使用JNA访问dll,并且一切正常……当我处于调试状态时!!! 问题是当我在非调试模式下运行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,DATEJOUR,EXMES
) {
// Do something with the CHAINE and DATEJOUR then fill SCHAINE and EXMES with an answer
to my call
提前感谢所有帮助,我被困住了
解决方法
PointerByReference
等效于C中的void **。这与您的本机函数原型不匹配。
String
等于const char*
。您的本机代码对该参数所指向的内存所做的任何更改都将被忽略。如果要为本地代码提供要填充的缓冲区,请使用byte[]
或Memory
。
然后,可以使用Memory.getString(0)
或Native.toString(byte[])
从结果构造JavaString
,而不是使用冗长的String
构造函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。