最近在做一个项目,使用java调用DLL,调用其中一个方法的时候,有时候能输出数据吗,有时候直接调用失败,请问这是为什么。里面create pointer了,我个人认为可能是创建指针分配内存的时候,系统分配了不可read的内存,所以才会调用失败。我的理解对吗?各位朋友帮帮忙吧
create pointer 用的啥 API ?
知道使用什么内存分配 API 可以分配只读的内存吗?
用 GetLastError 获取错误代码。
感谢您的回复。使用的是Jnative.具体它怎么实现的不怎么理解。因为有时候关机的时候系统错误提示,xxx指令引用的xxx不可以read,所以就猜了一下。
dll原型方法参数是char *类型的,所以需要给它分配内存空间
@xiaowei-blog: 乱猜测是会误导人的。把你调用的 dll 的方法的申明给贴出来。
@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:错误。
@xiaowei-blog: 我只能猜,因为这个 API 我不知道是谁写的。
针对这个 API,按照标准的解释是这样:
int ReadBaseMsg( unsigned char * pMsg, int * len);
失败返回 0,同时 len 表示实际需要的 BUFFER 大小,如果调用 GetLastError,应该返回 ERROR_INSUFFICIENT_BUFFER。
所以调用时,你需要提供 len 参数,将其默认值设置为 pMsg 的大小(字节数)。