62,621
社区成员
发帖
与我相关
我的任务
分享
说的应该够清楚的吧,或者你先看我的博客里面关于JNI的基础,虽然是Linux的,但windows的是一样。
java中的方法修改为public native short getCardSerialNum(short[] serial);
那么肯定需要再用javah工具编译出个头文件来,相应cpp的实现代码重新实现新的头文件中的函数,这个不难啊。
http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/jniTOC.html
这个是jni官方的API文档,给你参考参考,所有东西都在里面了
一个头两个大、您反正熟悉、。就动动手把java端和C端的给写全点给我参考吧、按你说的。我java里面申明“public native short getCardSerialNum(short[] serial);”又整了半天也没整对
typedef char (* getCardNum)(char[]);函数指针的申明没有问题吗?unsigned char __stdcall piccrequest(unsigned char *serial)
{
unsigned char cRet;
unsigned char pnsr[6];
cRet=checkM1();
if(cRet)return 24;
cRet=M1Request(0x0A,pnsr);
if(cRet)return 8;
cRet=M1Select(pnsr);
if(cRet)return 10;
if(serial==NULL)return 0;
else memcpy(serial,pnsr,4);
return 0;
}
这是原DLL里面的一个函数、我在java里是这样申明的: /**
* @return卡序列号
*/
public native String getCardSerialNo(byte[] serial);
对应的头文件里面的函数:/*
* Class: com_szzc_jni_JniApi
* Method: getCardSerialNo
* Signature: ([B)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_szzc_jni_JniApi_getCardSerialNo
(JNIEnv *, jobject, jbyteArray);
对应的CPP里面的代码是:#include "stdafx.h"
typedef char (* getCardNum)(char[]);
HINSTANCE hModule=NULL;
getCardNum gnum;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
JNIEXPORT jstring JNICALL Java_com_szzc_jni_JniApi_getCardSerialNo
(JNIEnv * env, jobject obj, jbyteArray jarray){
hModule=LoadLibrary("OUR_MIFARE.dll");
gnum = (getCardNum)GetProcAddress(hModule, "piccrequest");
//...
}
指定了之后怎么去调用那个piccrequest函数。那些数据类型怎么转换就不知道了。也不知道申明错没。我在网上找了个例子。 /**
* unsigned char __stdcall M1ReadSec(unsigned char cardtype, unsigned char
* *pwd, unsigned char sector, unsigned char *buf, unsigned char timeout)
*/
public native int m1ReadSec(String cardType, String password,
String sector, byte[] bufValue, int timeout);char有的声明成了int有的是string
JNI是什么?