当前位置: 代码迷 >> J2SE >> 1000分:请问一个JNA 调用 DLL的参数传递
  详细解决方案

1000分:请问一个JNA 调用 DLL的参数传递

热度:2012   发布时间:2013-02-25 00:00:00.0
1000分:请教一个JNA 调用 DLL的参数传递
其实本来就是闲的蛋疼,有个开发板,以前用VC,VB些过测试程序,,一时心血来潮,想弄个JAVA来控制下开发板玩玩
没想到遇到了个问题卡壳了,,, 

做过技术的人应该都能理解我的心情吧 呵呵

前前后后,已经送了1000分了对于这个问题, 但是还是没有解决掉,,前面的帖子都结了也

这次送1000分,问题解决后,另开贴9个帖子送分。
外加3合1的ARM开发板一块,配件齐全,但邮费需要自付。



我的问题如下,先列下我参考的代码,如下:

假设我们现在有这样一个C语言结构体
struct UserStruct{
  long id;
  wchar_t* name;
  int age;
};

使用上述结构体的函数
#define MYLIBAPI extern "C" __declspec( dllexport )   
MYLIBAPI void sayUser(UserStruct* pUserStruct);


对应的Java程序中,在例1的 接口中添加下列代码:
  public static class UserStruct extends Structure{
  public NativeLong id;
  public WString name;
  public int age;
public static class ByReference extends UserStruct implements Structure.ByReference { }
public static class ByValue extends UserStruct implements Structure.ByValue
 { }
  }
  public void sayUser(UserStruct.ByReference struct);

Java中的调用代码:
UserStruct userStruct=new UserStruct ();
  userStruct.id=new NativeLong(100);
  userStruct.age=30;
  userStruct.name=new WString("奥巴马"); TestDll1.INSTANCE.sayUser(userStruct);





 我觉得这段代码和我的应该比较类似的, 我做了如下的声明,请高手帮看看哪里有问题谢谢
 首先模仿结构的声明:


public static class UserStruct extends Structure{
public static class ByReference extends UserStruct implements Structure.ByReference { }
public static class ByValue extends UserStruct implements Structure.ByValue { }
public int Address;
public int Length;
public byte num[][]=new byte[8][30];
}




接口函数里做如下模仿


public static interface RFSAPIV2 extends Library {
  RFSAPIV2 INSTANCE = (RFSAPIV2)
  Native.loadLibrary("RFSAPIV2",
  RFSAPIV2.class);
  int ReadLabelID(long hh,int nMax, UserStruct.ByReference idBuffer,int[] nCounter);
}



 在按钮过程中做如下


private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {   
  // TODO add your handling code here:
  UserStruct idBuffer = new UserStruct();
  idBuffer.Address=0;
  idBuffer.Length=0;
  idBuffer.num[0][0]=(byte)0x00; // 这地方没有把数组全面初始化不知道影响否???

  int nCounter[]={0};
  int nMax=10;

  apiReturn=RFSAPIV2.INSTANCE.ReadID(hScanner[0], nMax, idBuffer, nCounter);
}



  做语法检查时,,提示上面的函数调用部分的红色字体,即第三个参数 错误。
  “
  无法将 接口 desktopapplication2.DesktopApplication2View.RFSAPIV2 中的 方法 ReadID 应用于 long,int,desktopapplication2.DesktopApplication2View.UserStruct.ByReference,int[](long,int,desktopapplication2.DesktopApplication2View.UserStruct,int[])
--
(按 Alt-Enter 组合键可显示提示)



请指导一下 ,谢谢。
指导解决问题后,送1000分,外加3合1 ARM开发板一块(邮资自付)
本人结贴即使,可参加近几天的结贴情况,已经前后送出了1000分了,就这个问题。。。










------最佳解决方案--------------------------------------------------------