int SbsGetConnectedDevices(TCHAR  szDevices[26], LPDWORD  lpdwLength);
java调用时候TCHAR和LPDWORD类型对应java中的什么类型呢?我用的的jna调用

解决方案 »

  1.   

    这个TCHAR应该是char类型吧
    LPDWORD是c++中的指针类型,java中没有指针这一说了!
      

  2.   


    用这个  com.sun.jna.ptr.IntByReferencepublic interface KernelTest extends StdCallLibrary {
         int SbsGetConnectedDevices(char[] devices, com.sun.jna.ptr.IntByReference number);
    }
      

  3.   

    谢谢你朋友,对于TCHAR这个jna文档上面介绍了可以对应byte[]或char[],我都试过但是调用该方法返回还值还是不对,研究了半天没弄出,最近的老调用dll不是c语言就是c++的 头疼~~~~~~
      

  4.   

    在DLL中肯定不可能出现TCHAR类型的,TCHAR只是一个宏,会随着DLL编译参数的不同转换成两种类型:CHAR和WCHAR,前者是ANSI编码的,后者是Unicode编码的,具体那种编码楼主必须明确,反正不可能是TCHAR。举个例子:如果你要调用Windows API提供的MessageBox函数,事实上“MessageBox”本身也是一个宏,对应到DLL中有两个函数:MessageBoxA和MessageBoxW,具体要调哪个得自己选择
      

  5.   

    另外不要用JNI,麻烦,用JNA吧,简单多了
      

  6.   


    那是搞定了还是没搞定?  我用的方法不可以吗?com.sun.jna.ptr.IntByReference 就是对应LPDWORD的传指针进去说明其实不是给JAVA用的哇  一般写给Java的不会搞个指针进去的
      

  7.   

    TCHAR这个东西要看dll是否是UNICODE版本,通常在dll文件版本信息里看得到。多数情况下是非UNICODE版本。
    用非UNICODE版本时用byte[]+IntByReference 
    UNICODE版本时用char[]+IntByReference调用时候还需注意的是数组和IntByReference都需要预先初始化。
    byte[] 先要分配足够长度,楼主的例子是 new byte[26]IntByReference要赋值数组长度。楼主的例子是IntByReference在调用之前要赋值26.
    调用返回后要根据IntByReference返回的数值截断byte数组.很大的可能是楼主调用失败的原因是没有对IntByReference赋值。
      

  8.   

    以前没弄过这样的问题,学习ing!