JNI的一些问题、
我现在需要用java去调用现存的DLL里的几个函数。
函数原型如下“
unsigned char __stdcall piccrequest(unsigned char *serial)
unsigned char __stdcall piccreadex(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *picckey,unsigned char *piccdata0_2)
下面是我JNI的声明:
/**
* @param serial
* @return返回卡序列
*/
public native String getCardSerial(char[] serial);
/**
* @return取0~2
*/
public native String getCardData(char ctrlWord, char[] serial, char area,
char key, char[] picckey, char[] piccdata0_2);
对应的C端的代码:
typedef unsigned char (__stdcall * getCardNum)(unsigned char[]);
typedef unsigned char (__stdcall * getDeviceNum)(unsigned char[]);
typedef unsigned char (__stdcall * getCardData)(unsigned char,unsigned char[],unsigned char,unsigned char,unsigned char[],unsigned char[]);
HINSTANCE hModule=NULL;
getCardNum gcnum;
getDeviceNum gdnum;
getCardData gdata;/*
读取卡序列号
*/
JNIEXPORT jstring JNICALL Java_com_szzc_jni_JniApi_getCardSerial
(JNIEnv * env, jobject obj, jcharArray js){
hModule=LoadLibrary("OUR_MIFARE.dll");
gcnum = (getCardNum)GetProcAddress(hModule, "piccrequest");
//.....
unsigned char * str = (unsigned char *)env->GetCharArrayElements(js,NULL);
unsigned char cardNum = gcnum(str);
printf("the return value of func is %d\n",cardNum);
printf("卡列号:\n");
unsigned char* p = str;
while(*p!='\0'){
printf("%x\n",*p);
p++;
}
return (jstring)cardNum;
}
JNIEXPORT jstring JNICALL Java_com_szzc_jni_JniApi_getCardData
(JNIEnv * env, jobject obj, jchar jc, jcharArray ja1, jchar jc2, jchar jc3, jcharArray ja2, jcharArray ja3){
hModule=LoadLibrary("OUR_MIFARE.dll");
gdata = (getCardData)GetProcAddress(hModule, "piccreadex");
unsigned char ctrlWord = (unsigned char)jc;
unsigned char area = (unsigned char)jc2;
unsigned char key=(unsigned char)jc3;
unsigned char * serial= (unsigned char *)env->GetCharArrayElements(ja1,NULL);
unsigned char * picckey= (unsigned char *)env->GetCharArrayElements(ja2,NULL);
unsigned char * piccdata= (unsigned char *)env->GetCharArrayElements(ja3,NULL);
unsigned char status = gdata(ctrlWord,serial,area,key,picckey,piccdata);
printf("%d\n",status);
cout << jc << endl;
cout << jc2 <<endl;
cout<< jc3 <<endl;
cout << "****" <<endl;
unsigned char* p = serial;
while(*p!='\0'){
printf("%x\n",*p);
p++;
}
jstring j=(jstring)"test";
return j;
}
我想问的是、在getCardSerial这个函数里面。怎么把str返回到java端、我java端传过去的是一个空的。调用DLL后才有的值、因为我getCardData这个函数还需要这个str结果。然后
char ctrlWord = 0x01 + 0x02 + 0x04 + 0x08 + 0x10;
char[] serial = { 0x1a, 0xa7, 0xde, 0xd4 };
char area = 0;
char key = 1;
char[] picckey = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
char[] piccdata0_2 = new char[64];
new JniApi().getCardData(ctrlWord, serial, area, key, picckey,
piccdata0_2);
对于char数组、以及单个的char、这样的声明方式是不是有问题?
因为我在C端打印serial 这个。好像只打印了第一个元素"1a"出来了。
[解决办法]
阿宝不在呢?
[解决办法]
c++中调试能得到这个返回的cardNum值吗?
还有jstring这种返回类型正确吗 就是与java的String契合吗
[解决办法]
封装一个对象返回吧,印象里JNI应当是不支持引用返回数据的