首页 新闻 会员 周边 捐助

请问Jnative调用DLL里面的方法,为什么有时成功有时候失败。

0
悬赏园豆:10 [待解决问题]

最近在做一个项目,使用java调用DLL,调用其中一个方法的时候,有时候能输出数据吗,有时候直接调用失败,请问这是为什么。里面create pointer了,我个人认为可能是创建指针分配内存的时候,系统分配了不可read的内存,所以才会调用失败。我的理解对吗?各位朋友帮帮忙吧

xiaowei-blog的主页 xiaowei-blog | 初学一级 | 园豆:179
提问于:2015-05-26 11:00
< >
分享
所有回答(1)
0

create pointer 用的啥 API ?

知道使用什么内存分配 API 可以分配只读的内存吗?

用 GetLastError 获取错误代码。

Launcher | 园豆:45050 (高人七级) | 2015-05-26 11:19

 感谢您的回复。使用的是Jnative.具体它怎么实现的不怎么理解。因为有时候关机的时候系统错误提示,xxx指令引用的xxx不可以read,所以就猜了一下。

dll原型方法参数是char *类型的,所以需要给它分配内存空间

支持(0) 反对(0) xiaowei-blog | 园豆:179 (初学一级) | 2015-05-26 13:41

@xiaowei-blog: 乱猜测是会误导人的。把你调用的 dll 的方法的申明给贴出来。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-05-26 13:46

@Launcher:

  接口方法原型:int ReadBaseMsg( unsigned char * pMsg, int * len);

 java调用:

     JNative jNative=new JNative("sdtapi","ReadBaseMsg");
  
         jNative.setRetVal(Type.INT);
        
         //设置参数pMsg[out] ,字节数不小于192.
         Pointer pointer=createPointer(192);
         pointer.zeroMemory();
         jNative.setParameter(0, pointer);
         //设置参数Len[out],可以给空值(NULL)
         jNative.setParameter(1, NullPointer.NULL);
        
         jNative.invoke();
        
       int retVal=jNative.getRetValAsInt();//retVal为1:正确;0:错误。

 

  

支持(0) 反对(0) xiaowei-blog | 园豆:179 (初学一级) | 2015-05-27 12:30

@xiaowei-blog: 我只能猜,因为这个 API 我不知道是谁写的。

针对这个 API,按照标准的解释是这样:

int ReadBaseMsg( unsigned char * pMsg, int * len);

失败返回 0,同时 len 表示实际需要的 BUFFER 大小,如果调用 GetLastError,应该返回 ERROR_INSUFFICIENT_BUFFER。

所以调用时,你需要提供 len 参数,将其默认值设置为 pMsg 的大小(字节数)。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-05-27 13:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册