工作中要用到java调用vc里的dll文件。用到了jni
查了一些资料,大体了解了jni调用dll的过程,但关于数据类型的转换还是有疑惑。
我的vc dll文件里有一个方法
Usb_Connect(
DWORD dwKeyIndex,
DWORD bandRate,
HANDLE* phKey);
那么在java文件里写这个函数的调用声明时,java方法的参数要怎么定义才合适? 没分类,给不聊了。
查了一些资料,大体了解了jni调用dll的过程,但关于数据类型的转换还是有疑惑。
我的vc dll文件里有一个方法
Usb_Connect(
DWORD dwKeyIndex,
DWORD bandRate,
HANDLE* phKey);
那么在java文件里写这个函数的调用声明时,java方法的参数要怎么定义才合适? 没分类,给不聊了。
对于对象类型特别是java.lang.String类型,需要进行转换,jni中有对于的函数将String类型转换成char*指针或者char数组,对于Object类型可以使用jni内置函数来实现。只要你导入javah.exe生成的头文件即可,头文件导入了jni.h文件。
但是我不知道句柄指针类型该用java里面什么基本数据类型来代替,我想用int[]数组表示,不知道行不行。
还有vc里面这个函数句柄phKey是在调用函数时由系统自己生成的,那么我的java里面写的相对应的方法在被调用时,对应句柄的那个参数该怎么传递?
希望你能给我一些指点
例如你的指针或者数组类型是基本数据类型,则解析指针,遍历出所有数据转换成jint,当然其实是不用转换的,然后用jni中内置的处理java数组的函数把这些基本数据类型数据遍历的转换成相应的java数组。
对于像结构体的指针或者C++对象类型的指针,你只能手动解析之中的数据变成基本数据类型,然后转换成java之中对应的对象类型。
对于像void*这种特殊指针,java对其是无法处理的。
总之一句话,就是把复杂类型转换成基础类型,然后通过函数手动进行转换,当然字符串类型有专门的转换函数,毕竟这是两门语言之间的通信,只有基础数据类型才能互相通信。
jni也支持在C中调用java方法,有相应的函数进行运用,对于这一点可以自己摸索。