Java调用DLL动态链接库的JNI方式详解(二)

2014-11-24 07:53:43 · 作者: · 浏览: 1
; //调用程序目录下须要有此动态库文件 if(hDll == NULL) { return -1; } pSMSStopSericeFun SMSStopSericeFun; SMSStopSericeFun = (pSMSStopSericeFun)GetProcAddress(hDll, "SMSStopSerice"); if(SMSStopSericeFun) { int iflag = SMSStopSericeFun(); if(iflag != 0) { printf("Serice stop success "); FreeLibrary(hDll); return 0; } else { printf("Serice stop fail "); FreeLibrary(hDll); return -1; } } else { return -1; FreeLibrary(hDll); } } JNIEXPORT jint JNICALL Java_com_my_util_SMSUtil_sendMsg (JNIEnv * env, jclass obj, jstring jMsg, jstring jPhone) { //HINSTANCE hDll = LoadLibrary("SMSDLL.dll"); //调用程序目录下须要有此动态库文件 if(hDll == NULL) { return -1; } char* msg = NULL; msg = jstringToWindows(env,jMsg); char* phone = NULL; phone = jstringToWindows(env,jPhone); pSMSSendMessageFun SMSSendMessageFun; pSMSQueryFun SMSQueryFun; SMSSendMessageFun = (pSMSSendMessageFun)GetProcAddress(hDll, "SMSSendMessage"); SMSQueryFun = (pSMSQueryFun)GetProcAddress(hDll, "SMSQuery"); if(SMSSendMessageFun && SMSQueryFun) { SMSSendMessageFun(msg, phone); Sleep(2000); } printf("message send done "); return 0; } char* jstringToWindows( JNIEnv *env, jstring jstr ) { int length = env->GetStringLength(jstr); const jchar* jcstr = env->GetStringChars(jstr, 0); char* rtn = (char*)malloc(length*2+1); int size = 0; size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL); if( size <= 0 ) return NULL; env->ReleaseStringChars(jstr, jcstr); rtn[size] = 0; return rtn; } 5、如果需要在64位环境中运行,需要修改工程配置:
SMSService属性

\

字符集设置使用多字节字符集,否则 LoadLibrary("SMSDLL.dll") 或出现错误
运行库设置成空,否则调用会出现错误


重新编译dll, 回到初始的java类,调用Main,测试成功!