加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JNA指针检索值

发布时间:2020-12-15 08:41:15 所属栏目:Java 来源:网络整理
导读:我正在使用JNA访问一个DLL,一切正常……我正在调试! 问题是我在非调试模式下运行我的java代码. dll的目的是通过在字符串中传递somme参数来调用 用结果填充char指针. 所以要在java中检索结果我正在使用PointerByReference对象. 当我在调试时没有问题,我得到
我正在使用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_NAISSANCEn19780102nMEDIAn4n".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 [])从结果中构造Java String,而不是使用相当冗长的String构造函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读