最近在用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(我手动输入的读取文件的长度这个值),而不是等于实际返回的数据的长度。希望高手能给予指点,小弟不省感激!!!