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,测试成功!