Skip to Main Content

JVM crash problem by invoking JNI interface, could someone help me?

800278Sep 25 2010 — edited Oct 8 2010
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
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked due to inactivity on Nov 5 2010
Added on Sep 25 2010
6 comments
2,025 views