? ? ?最近工作需要要调用第三方厂商提供的dll,学了下JNI,来分享下。
?
? ? ?说明:使用JNI来调用dll是JAVA调用符合JNI规范的dll,如需调用第三方的dll是在符合JNI规范的dll中再用c++掉用第三方的dll中的方法。
?
? ? 操作步骤:
? ? 1.新建java类将需要掉用的方法声明为native,增加导入dll的代码,例如:
? ??
class="java" name="code"> public static native ArrayList readCard(byte[] dataBuf); static { System.loadLibrary("XFBankJni"); }
? ?其中load的部分不是固定的,C++的项目生成的dll文件名即可
? ?2.先使用javac命令编译java类,然后使用javah命令编译 会生成“包名_java类名.h”,“.h”为C++中dll的头文件
? ?3.vs新建一个C++的Win32项目,应用程序类型选择DLL,将生成的头文件拷贝带该项目中。
? ?4.在生成的项目名.CPP文件中导入该头文件,并实现这些方法。
? ?5.调用第三方dll,申明方法,加载dll
HINSTANCE hDLL = LoadLibrary(_T("XfBankRwCard.dll"));//加载dll if(hDLL==NULL){ return jobjct(); } typedef int (WINAPI *InnoverCard)(char* dataBuf);//申明第三方dll中方法格式 InnoverCard icard=(InnoverCard)GetProcAddress(hDLL,"innoverCard");//加载dll中的方法 int result = icard(data);//调用第三方方法
?
?
? ? 碰到的问题:(由于没用过vs,c++所以碰到很多很低级的问题,写在这里希望对跟我一样不博学的人有帮助 ^_^)
jclass cls_ArrayList = env->FindClass("java/util/ArrayList"); jmethodID construct = env->GetMethodID(cls_ArrayList,"<init>","()V"); jobject obj_ArrayList = env->NewObject(cls_ArrayList,construct,""); jmethodID arrayList_add = env->GetMethodID(cls_ArrayList,"add","(Ljava/lang/Object;)Z"); env->CallObjectMethod(obj_ArrayList,arrayList_add,makeInteger(env,result)); env->CallObjectMethod(obj_ArrayList,arrayList_add,makeDouble(env,test));
char* databufChar = (char*)env->GetByteArrayElements(databuf, 0); double cardgases = 0; char cardno[11]; memset(cardno, 0, sizeof(cardno)); int result = readCard(databufChar,(char*)cardno,&cardgases);?
jstring stoJstring(JNIEnv *env, char* str){ jstring rtn = 0; int slen = strlen(str); unsigned short * buffer = 0; if( slen == 0 ) rtn = (env)->NewStringUTF(str ); else { int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 ); buffer = (unsigned short *)malloc( length*2 + 1 ); if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length )>0 ) rtn = (env)->NewString( (jchar*)buffer, length ); } if( buffer ) free( buffer ); return rtn; }
参考资料:
http://www.cnblogs.com/AnnieKim/archive/2012/01/01/2309567.html
http://blog.csdn.net/u_xtian/article/details/6033963
网上找的jni基础类型转java对象工具方法:
https://database.cs.brown.edu/svn/hstore/branches/newdtxn-branch/third_party/cpp/tpceloader/drivers/JNIUtils.cpp