工作中要用到java调用vc里的dll文件。用到了jni 
查了一些资料,大体了解了jni调用dll的过程,但关于数据类型的转换还是有疑惑。 
我的vc dll文件里有一个方法 
    Usb_Connect( 
DWORD dwKeyIndex, 
DWORD bandRate, 
HANDLE*  phKey); 
那么在java文件里写这个函数的调用声明时,java方法的参数要怎么定义才合适? 没分类,给不聊了。

解决方案 »

  1.   

    对于java中的基础数据类型,jni.h中应该有对应的java基础数据类型与C基础数据类型的定义,例如jint类型直接对于long类型,jlong类型直接对于int_64类型,当然这是vc中的定义。
    对于对象类型特别是java.lang.String类型,需要进行转换,jni中有对于的函数将String类型转换成char*指针或者char数组,对于Object类型可以使用jni内置函数来实现。只要你导入javah.exe生成的头文件即可,头文件导入了jni.h文件。
      

  2.   

    我java里面的方法,直接用int代替的DWORD类型,生成的.h文件里面是jint 类型做的转换。
    但是我不知道句柄指针类型该用java里面什么基本数据类型来代替,我想用int[]数组表示,不知道行不行。
    还有vc里面这个函数句柄phKey是在调用函数时由系统自己生成的,那么我的java里面写的相对应的方法在被调用时,对应句柄的那个参数该怎么传递?
    希望你能给我一些指点
      

  3.   

    对于指针类型或者句柄类型都需要自己处理。
    例如你的指针或者数组类型是基本数据类型,则解析指针,遍历出所有数据转换成jint,当然其实是不用转换的,然后用jni中内置的处理java数组的函数把这些基本数据类型数据遍历的转换成相应的java数组。
    对于像结构体的指针或者C++对象类型的指针,你只能手动解析之中的数据变成基本数据类型,然后转换成java之中对应的对象类型。
    对于像void*这种特殊指针,java对其是无法处理的。
    总之一句话,就是把复杂类型转换成基础类型,然后通过函数手动进行转换,当然字符串类型有专门的转换函数,毕竟这是两门语言之间的通信,只有基础数据类型才能互相通信。
    jni也支持在C中调用java方法,有相应的函数进行运用,对于这一点可以自己摸索。