jni 调用vc dll 字符串传入问题

vickorfox 2009-07-13 09:31:21
最近在用jni 调用vc的dll接口。
vc有一个接口是Usb_WriteFile(
HANDLE hKey, // 目标key的句柄
LPBYTE FileName, //文件名
DWORD NameLen, // 文件名长度
DWORD WdataLen, //要写入数据的长度
LPBYTE Wdata //写入的数据 unsigned char * 类型
);

我在java方法里面写的对应的函数
public native static int usb_WriteFile(int hKey,String lpFileName,int lpFileNameLen,int lpWdataLen,String lpWdata);
相应的把Wdata定义成了String类型,在方法里面把要写入的数据是以字符串的形式写的。
在我自己写的dll文件中,我是如下做的转换。
JNIEXPORT jint JNICALL Java_sd_zf_key_Java_1ZfKey_usb_WriteFile
(JNIEnv * env, jclass, jint phKey, jstring lpFileName, jint lpFileNameLen, jint lpWdataLen, jstring lpWdata)
{
HANDLE hKey=(HANDLE)phKey;
unsigned char * FileName=(unsigned char *)(env)->GetStringUTFChars(lpFileName,0);
unsigned char * Wdata=(unsigned char *)(env)->GetStringUTFChars(lpWdata,0);
DWORD NameLen=(DWORD)lpFileNameLen;
DWORD WdataLen=(DWORD)lpWdataLen;
int rv= Usb_WriteFile(
hKey,
FileName,
NameLen,
WdataLen,
Wdata
);
}
vc的dll还有一个读取文件的接口是
DWORD Usb_ReadFile (

HANDLE hKey,
LPBYTE lpFileName,
DWORD lpFileNameLen,
DWORD lpRdataLen, //要读取数据的长度
LPBYTE lpRdata, //读取数据的返回值
LPDWORD lpOutDataLen //数据返回值的长度。在接口被调用后可以自动获取到的一个值。 unsigned long* 类型

);
调用这个接口可以得到已经写入文件的数据 lpRdata和返回数据的实际长度 lpOutDataLen
下面是我在自己的dll文件里写的转换
JNIEXPORT jstring JNICALL Java_sd_zf_key_Java_1ZfKey_usb_ReadFile
(JNIEnv * env, jclass, jint phKey, jstring lpFileName, jint lpFileNameLen, jint lpRdataLen, jstring lpRdata, jint lpOutDataLen)
{
HANDLE hKey=(HANDLE)phKey;
DWORD NameLen=(DWORD)lpFileNameLen;
DWORD RdataLen=(DWORD)lpRdataLen;
DWORD * OutDataLen=(DWORD *)malloc( sizeof(DWORD));
unsigned char * FileName=(unsigned char *)(env)->GetStringUTFChars(lpFileName,0);
unsigned char * Rdata=(unsigned char *)malloc(RdataLen);
memset(Rdata,0,RdataLen);
int rv= Usb_ReadFile(
hKey,
FileName,
NameLen,
RdataLen,
Rdata,
(LPDWORD)OutDataLen
);

unsigned char * Rrdata=(unsigned char *)malloc(* OutDataLen);

if(rv==USBKEY_SUCCESS)
{
memcpy(Rrdata,(const void *)Rdata,* OutDataLen);
printf("Usb_ReadFile 成功!\n 读出数据: %s \n 读出数据长度:%d\n",Rrdata,*OutDataLen);
lpRdata=(env)->NewStringUTF((const char *)Rrdata);
}
(env)->ReleaseStringUTFChars(lpFileName,(const char *)FileName);

}
我有一些疑问:
在java里面写入数据时,定义成了String类型。
1. 我要写入二进制数据时怎么办?
2. 数据返回值的长度OutDataLen。为什么我得到的这个值总是等于RdataLen(我手动输入的读取文件的长度这个值),而不是等于实际返回的数据的长度。

希望高手能给予指点,小弟不省感激!!!
...全文
169 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
vickorfox 2009-07-13
  • 打赏
  • 举报
回复
高手啊,帮帮我啊。。。
vickorfox 2009-07-13
  • 打赏
  • 举报
回复
free(OutDataLen);
free(Rrdata);
free(Rdata);

我在自己的程序里已经释放了申请的空间

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧