I use JNI native interfaces in my project, but it will cause jvm crash when running in a while.
Could someone help me?
I search some documents on the web. it says There may be wrong pointer exceptions. But I can't find the bug in my c++ code.
Following is the code. Please help me review the code to find out the bugs. thank you!
#include <stdio.h>
#include <sstream>
#ifdef WIN32
#include <string>
#else
#include <string.h>
#endif
#include "com_snda_billgate_biz_JNI4CheckBillgate.h"
#include "ThreadLock.h"
#include "osap4service.h"
CThreadLock g_Lock;
IOsapService* pOsapService = NULL;
JNIEXPORT jint JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_Initialize(JNIEnv *env, jclass obj,jstring path)
{
if( pOsapService == NULL )
{
pOsapService = OsapCreateService();
}
return 0;
}
/*
* Class: com_snda_billgate_biz_JNI4CheckBillgate
* Method: Uninitialize
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_Uninitialize(JNIEnv *env, jclass obj)
{
pOsapService->Release();
pOsapService = NULL;
return;
}
/*
* Class: com_snda_billgate_biz_JNI4CheckBillgate
* Method: SdoAspSvcInit
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_SdoAspSvcInit(JNIEnv *env, jclass obj, jint systemid, jstring filePath)
{
//g_Lock.Lock();
//printf("In SdoAspSvcInit Func......\n");
int iResult = -1;
char szFilePath[1024];
int len = env->GetStringLength(filePath);
if( len >0 )
{
env->GetStringUTFRegion(filePath,0,len,szFilePath);
iResult = pOsapService->Initialize(systemid,szFilePath);
env->DeleteLocalRef(filePath);
}
//printf("Out SdoAspSvcInit Func......\n");
//g_Lock.Unlock();
return iResult;
}
/*
* Class: com_snda_billgate_biz_JNI4CheckBillgate
* Method: SdoAspGetGsInfo
* Signature: (ILcom/snda/billgate/biz/ServiceAreaGroupData;)Lcom/snda/billgate/biz/ServiceAreaGroupData;
*/
JNIEXPORT jobject JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_SdoAspGetGsInfo(JNIEnv *env, jclass obj, jint key, jobject info)
{
//g_Lock.Lock();
//printf("In SdoAspGetGsInfo Func\n");
bool bInit =false;
int spid;
int serviceid;
int areaid;
int groupid;
int msgid;
msgid = pOsapService->GetAppInfoByKey(key,&spid,&serviceid,&areaid,&groupid);
//printf("sp %d.\n",spid);
//printf("serv %d.\n",serviceid);
//printf("area%d.\n",areaid);
//printf("grou %d.\n",groupid);
//printf("res %d.\n",msgid);
static jclass gsinfo_class;
static jmethodID setSpid_method;
static jmethodID setServiceid_method;
static jmethodID setAreaid_method;
static jmethodID setGroupid_method;
static jmethodID setMsgid_method;
if(!bInit)
{
g_Lock.Lock();
if(!bInit)
{
if(gsinfo_class == NULL)
{
gsinfo_class = env->FindClass("com/snda/billgate/biz/ServiceAreaGroupData");
}
if(setMsgid_method == NULL)
{
setMsgid_method = env->GetMethodID(gsinfo_class, "setMsgid", "(I)V");
}
if(setSpid_method == NULL)
{
setSpid_method = env->GetMethodID(gsinfo_class, "setSpid", "(I)V");
}
if(setServiceid_method == NULL)
{
setServiceid_method = env->GetMethodID(gsinfo_class, "setServiceid", "(I)V");
}
if(setAreaid_method == NULL)
{
setAreaid_method = env->GetMethodID(gsinfo_class, "setAreaid", "(I)V");
}
if(setGroupid_method == NULL)
{
setGroupid_method = env->GetMethodID(gsinfo_class, "setGourpid", "(I)V");
}
bInit = true;
}
g_Lock.Unlock();
}
if(bInit)
{
env->CallVoidMethod(info, setMsgid_method, msgid);
if( msgid == 0)
{
env->CallVoidMethod(info, setSpid_method, spid);
env->CallVoidMethod(info, setServiceid_method, serviceid);
env->CallVoidMethod(info, setAreaid_method, areaid);
env->CallVoidMethod(info, setGroupid_method, groupid);
}
}
//g_Lock.Unlock();
return info;
}
/*
* Class: com_snda_billgate_biz_JNI4CheckBillgate
* Method: SdoAspAuthen
* Signature: (ILjava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_SdoAspAuthen(JNIEnv *env, jclass obj, jint key, jstring svcmask)
{
//g_Lock.Lock();
//printf("In SdoAspAuthen Func......\n");
int iResult = -1;
char szSvcmask[64];
int len = env->GetStringLength(svcmask);
if( len >0 )
{
env->GetStringUTFRegion(svcmask,0,len,szSvcmask);
iResult = pOsapService->CheckAuthorization(key,szSvcmask);
env->DeleteLocalRef(svcmask);
}
//printf("Out SdoAspAuthen Func......\n");
//g_Lock.Unlock();
return iResult;
}
/*
* Class: com_snda_billgate_biz_JNI4CheckBillgate
* Method: SdoAspSetDigest
* Signature: (ILjava/lang/String;ILcom/snda/billgate/biz/ServeceAreaGroupData;)Lcom/snda/billgate/biz/ServeceAreaGroupData;
*/
JNIEXPORT jobject JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_SdoAspSetDigest(JNIEnv *env, jclass obj, jint key, jstring buf, jint inlen, jobject retObj)
{
//g_Lock.Lock();
//printf("In SdoAspSetDigest Func......\n");
bool bInit = false;
int msgid;
char szBuf[4096];
memset(szBuf,0,4096);
char* pDigest;
pDigest = new char[512];
memset(pDigest,0,512);
static jclass SetDigest_class;
static jmethodID setMsgid_method;
static jmethodID setDigest_method;
int len = env->GetStringLength(buf);
if( len>0)
{
env->GetStringUTFRegion(buf,0,len,szBuf);
env->DeleteLocalRef(buf);
msgid = pOsapService->GetDigestByCoupleKey(key,szBuf,inlen,pDigest);
if(!bInit)
{
g_Lock.Lock();
if(!bInit)
{
if( SetDigest_class == NULL )
{
SetDigest_class = env->FindClass("com/snda/billgate/biz/ServiceAreaGroupData");
}
if( setMsgid_method == NULL )
{
setMsgid_method = env->GetMethodID(SetDigest_class, "setMsgid", "(I)V");
}
if( setDigest_method == NULL )
{
setDigest_method = env->GetMethodID(SetDigest_class, "setResMsg", "(Ljava/lang/String;)V");
}
}
bInit = true;
g_Lock.Unlock();
}
if(bInit)
{
env->CallVoidMethod(retObj,setMsgid_method,msgid);
//printf("msgid= %d.\n",msgid);
if( msgid == 0 )
{
jstring first = env->NewStringUTF(pDigest);
env->CallObjectMethod(retObj,setDigest_method,first);
//printf("pDigest= %d.\n",pDigest);
env->DeleteLocalRef(first);
}
}
if( pDigest != NULL)
{
delete[] pDigest;
}
}
//printf("Out SdoAspSetDigest Func......\n");
//g_Lock.Unlock();
return retObj;
}
/*
* Class: com_snda_billgate_biz_JNI4CheckBillgate
* Method: SdoAspCheckDigest
* Signature: (ILjava/lang/String;ILjava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_SdoAspCheckDigest(JNIEnv *env, jclass obj , jint key, jstring buf, jint inlen, jstring digest)
{
//g_Lock.Lock();
//printf("In SdoAspCheckDigest Func......\n");
if( (digest == NULL) || (buf == NULL) )
{
return -1;
}
char szBuf[4096];
char szDigest[4096];
int len = env->GetStringLength(buf);
int len2 = env->GetStringLength(digest);
if((len>0) && (len2>0))
{
env->GetStringUTFRegion(buf,0,len,szBuf);
env->GetStringUTFRegion(digest,0,len2,szDigest);
env->DeleteLocalRef(buf);
env->DeleteLocalRef(digest);
}
//printf("Out SdoAspCheckDigest Func......\n");
//g_Lock.Unlock();
return pOsapService->CheckDigest(key,szBuf, inlen, szDigest);
}
/*
* Class: com_snda_billgate_biz_JNI4CheckBillgate
* Method: SdoAspSetDigestForBytes
* Signature: (I[BLcom/snda/billgate/biz/ServiceAreaGroupData;)Lcom/snda/billgate/biz/ServiceAreaGroupData;
*/
JNIEXPORT jobject JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_SdoAspSetDigestForBytes(JNIEnv * env, jobject obj, jint key, jbyteArray bytearr, jobject retObj)
{
//g_Lock.Lock();
//printf("In SdoAspSetDigestForBytes Func......\n");
bool bInit = false;
int msgid;
jsize len = env->GetArrayLength(bytearr);
char* pBuf = NULL;
char* pDigest;
pDigest = new char[512];
memset(pDigest,0,512);
static jclass SetDigest_class;
static jmethodID setMsgid_method;
static jmethodID setDigest_method;
//int len = env->GetStringLength(buf);
if( len>0)
{
//env->GetStringUTFRegion(buf,0,len,szBuf);
//env->DeleteLocalRef(buf);
jbyte* byteArray = env->GetByteArrayElements(bytearr, 0);
pBuf = (char*)byteArray;
msgid = pOsapService->GetDigestByCoupleKey(key,pBuf,len,pDigest);
env->ReleaseByteArrayElements(bytearr,byteArray,0);
if(!bInit)
{
g_Lock.Lock();
if(!bInit)
{
if( SetDigest_class == NULL )
{
SetDigest_class = env->FindClass("com/snda/billgate/biz/ServiceAreaGroupData");
}
if( setMsgid_method == NULL )
{
setMsgid_method = env->GetMethodID(SetDigest_class, "setMsgid", "(I)V");
}
if( setDigest_method == NULL )
{
setDigest_method = env->GetMethodID(SetDigest_class, "setResMsg", "(Ljava/lang/String;)V");
}
}
bInit = true;
g_Lock.Unlock();
}
if(bInit)
{
env->CallVoidMethod(retObj,setMsgid_method,msgid);
//printf("msgid= %d.\n",msgid);
if( msgid == 0 )
{
jstring first = env->NewStringUTF(pDigest);
env->CallObjectMethod(retObj,setDigest_method,first);
//printf("pDigest= %d.\n",pDigest);
env->DeleteLocalRef(first);
}
}
}
if( pDigest != NULL)
{
delete[] pDigest;
}
//printf("Out SdoAspSetDigestForBytes Func......\n");
//g_Lock.Unlock();
return retObj;
}
/*
* Class: com_snda_billgate_biz_JNI4CheckBillgate
* Method: SdoAspCheckDigestForBytes
* Signature: (I[BLjava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_SdoAspCheckDigestForBytes(JNIEnv *env, jobject obj, jint key, jbyteArray bytearr, jstring digest)
{
//g_Lock.Lock();
//printf("In SdoAspCheckDigestForBytes Func......\n");
if( digest == NULL)
{
return -1;
}
char szDigest[4096];
jsize len = env->GetArrayLength(bytearr);
if(len == 0)
{
return -1;
}
char* pBuf = NULL;
jbyte* byteArray;
//int len = env->GetStringLength(buf);
int len2 = env->GetStringLength(digest);
if((len>0) && (len2>0))
{
byteArray = env->GetByteArrayElements(bytearr, 0);
pBuf = (char*)byteArray;
env->GetStringUTFRegion(digest,0,len2,szDigest);
//env->DeleteLocalRef(buf);
env->DeleteLocalRef(digest);
}
//printf("Output:InputBuf:%s,InputLen:%d,InputDigest:%s~~~~~~\n",pBuf,len,szDigest);
int nResult = pOsapService->CheckDigest(key,pBuf, len, szDigest);
if(len >0 )
{
env->ReleaseByteArrayElements(bytearr,byteArray,0);
}
return nResult;
}
/*
* Class: com_snda_billgate_biz_JNI4CheckBillgate
* Method: SdoAspGetKeyByEndpointIP
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_snda_billgate_biz_JNI4CheckBillgate_SdoAspGetKeyByEndpointIP
(JNIEnv* env, jobject obj, jstring strIP, jstring strAlias)
{
if( (strIP == NULL) || ( strAlias == NULL ) )
{
return -1;
}
char szBuf[4096];
char szBuf1[4096];
memset(szBuf,0,4096);
memset(szBuf1,0,4096);
int len = env->GetStringLength(strIP);
if(len>0)
{
env->GetStringUTFRegion(strIP,0,len,szBuf);
env->DeleteLocalRef(strIP);
}
int len2 = env->GetStringLength(strAlias);
if(len>0)
{
env->GetStringUTFRegion(strAlias,0,len2,szBuf1);
env->DeleteLocalRef(strAlias);
}
int nResult = -1;
int nRet = pOsapService->GetKeyByIPAlias(szBuf,szBuf1,&nResult);
if( nRet == 0 )
{
return nResult;
}else
{
return -1;
}
}
Edited by: EJP on 29/09/2010 13:33