一个困绕了我3天的JNA问题

09-01-09 fejjsong
虽然用jna的人还比较少,我还是抱着试试的态度到这里请教一下大家

在dll库里有一个struct和一个方法

typedef unsigned long int SM_ALGORITHM_TYPE;
typedef void        *   PSM_VOID;
typedef unsigned long int SM_ULONG;
 
typedef struct  _SM_ALGORITHM{
  SM_ALGORITHM_TYPE  AlgoType;
  PSM_VOID      pParameter;
  SM_ULONG    ulParameterLen;  // In bytes
#ifdef __cplusplus
  _SM_ALGORITHM()
  {
   AlgoType = 0;
   pParameter = NULL;
   ulParameterLen = 0;
  }
#endif
} SM_ALGORITHM, *PSM_ALGORITHM;

SM_HashInit(
  SM_PIPE_HANDLE hPipe,
  PSM_ALGORITHM pAlgo
)

<p>

SM_PIPE_HANDLE是加密卡设备的管道句柄。

然后我在java里的对应struct的类和上面的方法:

public static class SM_ALGORITHM extends Structure {
   public static class ByReference extends SM_ALGORITHM implements
     Structure.ByReference {
   }
   public NativeLong AlgoType;
   public byte[] pParameter;
   public NativeLong ulParameterLen;
  }

public short SM_HashInit(NativeLong hPipe, SM_ALGORITHM.ByReference sm);

<p>

但是最后返回一个值,0X0030,参数错误,证明这个函数是能调用了,句柄获取正确,就是第二个参数,那个SM_ALGORITHM的问题,但是我又检查不出问题在哪里,困绕我3天了。有的时候不得不用java去调用设备。大家帮忙看看。是不是我struct mapping到java类的时候有什么问题?还是其他的?谢谢了

lhy5201314
2009-02-25 21:35
你好,你描述的问题解决了吗

lhy5201314
2009-02-25 21:58
我也有个问题想请教你下,

在delphi里面的机构体为:

Java代码

DataBuf = record

h1,m1,h2,m2:integer;

end;

PDataBuf=^DataBuf;

DataBuf = record

h1,m1,h2,m2:integer;

end;

PDataBuf=^DataBuf;

而我在JAVA里面定义的为:

Java代码

public class DataBuf extends Structure {

public int h1;

public int m1;

public int h2;

public int m2;

}

public class DataBuf extends Structure {

public int h1;

public int m1;

public int h2;

public int m2;

}

下面为访问dll库的函数:

Java代码

public int GetRepast(int idx,IntByReference ConPerNo,DataBuf c1,int TerNo,int Port);

其中参数DataBuf c1就是传进去的结构体,问题是现在的参数可以用这个结构体参数读的出来,但是不能往进写.你看哈子能不能解决 大家互相讨论讨论 呵呵

猜你喜欢