/**
 * Copyright (C) 2009 Samsung Electronics Co., Ltd. All rights reserved.
 *
 * Mobile Communication Division,
 * Digital Media & Communications Business, Samsung Electronics Co., Ltd.
 *
 * This software and its documentation are confidential and proprietary
 * information of Samsung Electronics Co., Ltd.  No part of the software and
 * documents may be copied, reproduced, transmitted, translated, or reduced to
 * any electronic medium or machine-readable form without the prior written
 * consent of Samsung Electronics.
 *
 * Samsung Electronics makes no representations with respect to the contents,
 * and assumes no responsibility for any errors that might appear in the
 * software and documents. This publication and the contents hereof are subject
 * to change without notice.
 */

#include "et9cmmUtil.h"
#include <memory.h>
#ifdef LOAD_DB_FROM_FILE
#include <dirent.h>
#include <unistd.h>
#include "et9aldb.h"
#include "et9kdb.h"
#include "et9alphaUtil.h"
#include "et9kdbUtil.h"
#include "et9cpldb.h"
#endif
#include "et9misc.h"
/*----------------------------------------------------------------------------
 * Local Variables
 *----------------------------------------------------------------------------*/
#ifdef SUPPORT_CALLBACK
static CallbackInterface CBInterface;
#endif

/*----------------------------------------------------------------------------
 * Global Variables
 *----------------------------------------------------------------------------*/
#ifdef __DEBUG__
Log log;
#endif

#ifdef LOAD_DB_FROM_FILE
#define LDB_FILE_EXT     "ldb"
#define KDB_FILE_EXT     "kdb"
#define XML_KDB_FILE_EXT     "xml"


extern LDBFileInfo    *pLDBFileList;
extern KDBFileInfo    *pKDBFileList;
ET9BOOL bInitDBFlieList = FALSE;
#endif

/*----------------------------------------------------------------------------
 * function definition
 *----------------------------------------------------------------------------*/
#ifdef SUPPORT_CALLBACK
ET9STATUS ET9FARCALL ET9InitCallback(JNIEnv *env, jobject obj)
{
	if(env == NULL || obj == NULL)
		return ET9STATUS_NO_INIT;

	if(CBInterface.InitOK)
		(*env)->DeleteGlobalRef(env, CBInterface.obj);

	CBInterface.InitOK = TRUE;
	CBInterface.env = env;
	CBInterface.obj = (*env)->NewGlobalRef(env, obj);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9ClearCallback(JNIEnv *env)
{
	if(env == NULL)
		return ET9STATUS_INVALID_MEMORY;

	if(CBInterface.InitOK)
		(*env)->DeleteGlobalRef(env, CBInterface.obj);

	CBInterface.obj = NULL;
	CBInterface.env = NULL;
	CBInterface.InitOK = FALSE;

	return ET9STATUS_NONE;
}

jlong ET9FARCALL GetCurrentTimeMillis()
{
	jclass      cls;
	jmethodID   mid;
	jlong       msec = 0;

	if(CBInterface.InitOK == FALSE)
		return 0;

	cls = (*CBInterface.env)->GetObjectClass(CBInterface.env, CBInterface.obj);
	mid = (*CBInterface.env)->GetMethodID(CBInterface.env, cls, "GetCurrentTimeMillis", "()J");

	if(mid == 0)
		return 0;

	msec = (*CBInterface.env)->CallLongMethod(CBInterface.env, CBInterface.obj, mid);

	return msec;
}

ET9STATUS ET9SetMultitapStartTime(jlong startTime)
{
	jclass      cls;
	jmethodID   mid;
	jlong       msec = 0;

	LOG1("ET9SetMultitapStartTime [%lu]",(long unsigned int) startTime);
#if 0
	if(CBInterface.InitOK == FALSE)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*CBInterface.env)->GetObjectClass(CBInterface.env, CBInterface.obj);
	mid = (*CBInterface.env)->GetMethodID(CBInterface.env, cls, "SetMultitapStartTime", "(J)V");

	if(mid == 0)
		return ET9STATUS_INVALID_MEMORY;

	(*CBInterface.env)->CallVoidMethod(CBInterface.env, CBInterface.obj, mid, startTime);
#else
	jfieldID    fid;

	cls = (*CBInterface.env)->GetObjectClass(CBInterface.env, CBInterface.obj);
	fid = (*CBInterface.env)->GetFieldID(CBInterface.env, cls, "multitapStartTime", "J");

	(*CBInterface.env)->SetLongField(CBInterface.env, CBInterface.obj, fid, startTime);
#endif

	return ET9STATUS_NONE;
}
#endif // SUPPORT_CALLBACK

#ifdef __DEBUG__
void ET9FARCALL PrintMessage(char *msg)
{
	jclass      cls;
	jmethodID   mid;
	jstring     _msg;

	if(CBInterface.InitOK == FALSE) return;

	cls = (*CBInterface.env)->GetObjectClass(CBInterface.env, CBInterface.obj);
	mid = (*CBInterface.env)->GetMethodID(CBInterface.env, cls, "printMessage", "(Ljava/lang/String;)V");

	if(mid == 0) return;

	_msg = (*CBInterface.env)->NewStringUTF(CBInterface.env, msg);

	(*CBInterface.env)->CallVoidMethod(CBInterface.env, CBInterface.obj, mid, _msg);
}
#endif

#ifdef LOAD_DB_FROM_FILE
ET9STATUS MakeDBFileList(ET9U8 *dirPath)
{
	DIR            *pDir;
	struct dirent  *pDirent;
	FILE           *pFileHandle;
	ET9U8          filePath[MAX_FILE_PATH];
	ET9U8          DBBuffer[DB_BUFFER_SIZE];

	ET9U16         ldbIndex = 0;
	ET9U16         kdbIndex = 0;
	ET9U8          primaryLanguageID = 0;
	ET9U8          secondaryLanguageID = 0;
	ET9U16         languageCode = 0;
	int nInt;
	char *pcTag;

	if (bInitDBFlieList)
		return ET9STATUS_NONE;

	pDir = opendir(DB_FILE_PATH);

	if (pDir == NULL)
		return ET9STATUS_READ_DB_FAIL;

	while ((pDirent = readdir(pDir)) != NULL)
	{
		int length = strlen(pDirent->d_name);

		if (length >= 3)
		{
			if (strcmp(&pDirent->d_name[length - 3], LDB_FILE_EXT) == 0)
			{
				sprintf(filePath, "%s/%s", DB_FILE_PATH, pDirent->d_name);
				pFileHandle = fopen(filePath, "r");

				if (pFileHandle != NULL)
				{
					/* Get LDB ID */
					if (fread(DBBuffer, sizeof(ET9U8), DB_BUFFER_SIZE, pFileHandle))
					{
						if ( DBBuffer[ET9_CP_DB_TYPE_OFFSET] == ET9_CP_DBTYPE )
						{
							primaryLanguageID = DBBuffer[ET9_CP_LANGUAGE_ID_OFFSET];
							languageCode = primaryLanguageID;
							pLDBFileList[ldbIndex].ldbCode = languageCode;
						}
						else {
							primaryLanguageID = DBBuffer[ET9LDBOFFSET_PRIMARYLANGID];
							secondaryLanguageID = DBBuffer[ET9LDBOFFSET_SECONDARYLANGID];
							languageCode = (secondaryLanguageID << 8) | primaryLanguageID;
							pLDBFileList[ldbIndex].ldbCode = languageCode;
						}
					}

					/* Get file Path */
					strcpy(pLDBFileList[ldbIndex].filePath, filePath);

					/* Get file Size */
					if (fseek(pFileHandle, 0L, SEEK_END) != -1)
						pLDBFileList[ldbIndex].fileSize = ftell(pFileHandle);

					ldbIndex++;
					fclose(pFileHandle);
				}
			}
			else if (strcmp(&pDirent->d_name[length - 3], KDB_FILE_EXT) == 0)
			{
				sprintf(filePath, "%s/%s", DB_FILE_PATH, pDirent->d_name);
				pFileHandle = fopen(filePath, "r");

				if (pFileHandle != NULL)
				{
					/* Get KDB ID */
					if (fread(DBBuffer, sizeof(ET9U8), DB_BUFFER_SIZE, pFileHandle))
					{
						primaryLanguageID = DBBuffer[ET9KDBOFFSET_PRIMARYKEYBOARDID];
						secondaryLanguageID = DBBuffer[ET9KDBOFFSET_SECONDKEYBOARDID];
						languageCode = (secondaryLanguageID << 8) | primaryLanguageID;
						pKDBFileList[kdbIndex].kdbCode = languageCode;
					}

					/* Get file Path */
					strcpy(pKDBFileList[kdbIndex].filePath, filePath);

					/* Get file Size */
					if (fseek(pFileHandle, 0L, SEEK_END) != -1)
						pKDBFileList[kdbIndex].fileSize = ftell(pFileHandle);

					kdbIndex++;
					fclose(pFileHandle);
				}
			}
			else if (strcmp(&pDirent->d_name[length - 3], XML_KDB_FILE_EXT) == 0)
			{
				sprintf(filePath, "%s/%s", DB_FILE_PATH, pDirent->d_name);
				pFileHandle = fopen(filePath, "rb");
				fseek(pFileHandle, 0, SEEK_END);
				int nSize = ftell(pFileHandle);
				rewind(pFileHandle);
				ET9U8 *pbContent = (ET9U8*)malloc(nSize);
				if (pbContent) {
					if (pFileHandle != NULL)
					{
						/* Get KDB ID */
						if (fread(pbContent, 1, nSize, pFileHandle) == nSize)
						{
							char * pcContent = (char*)pbContent;
							pcTag = strstr(pcContent, "primaryId");
							if (pcTag) {
								while (*pcTag != '"') {
									++pcTag;
								};
								++pcTag;
								if (*(pcTag + 1) == 'x' || *(pcTag + 1) == 'X') {
									sscanf(pcTag + 2, "%x", &nInt);
								}
								else {
									sscanf(pcTag, "%d", &nInt);
								}
								primaryLanguageID = (ET9U8)nInt;
							}
							
							pcTag = strstr(pcContent, "secondaryId");
							if (pcTag) {
								while (*pcTag != '"') {
									++pcTag;
								};
								++pcTag;

								if (*(pcTag + 1) == 'x' || *(pcTag + 1) == 'X') {
									sscanf(pcTag + 2, "%x", &nInt);
								}
								else {
									sscanf(pcTag, "%d", &nInt);
								}
								secondaryLanguageID = (ET9U8)nInt;
							}
							languageCode = (secondaryLanguageID << 8) | primaryLanguageID;
							pKDBFileList[kdbIndex].kdbCode = languageCode;
						}
						free(pbContent);
						/* Get file Path */
						strcpy(pKDBFileList[kdbIndex].filePath, filePath);

						/* Get file Size */
						
						pKDBFileList[kdbIndex].fileSize = nSize;

						kdbIndex++;
						fclose(pFileHandle);
					}
				}
			}
		}
	}

	closedir(pDir);
	bInitDBFlieList = TRUE;

	return ET9STATUS_NONE;
}

#endif

/*----------------------------------------------------------------------------
 * Get <Type> object Array Function
 *----------------------------------------------------------------------------*/
ET9STATUS ET9FARCALL GetBooleanObjectArray(JNIEnv *env, jclass jcls, ET9BOOL*nat_array, jobject jobj_array,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	ET9BOOL *_pjobj_array = (ET9BOOL *)(*env)->GetBooleanArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)nat_array,(ET9U8  const *)_pjobj_array,(ET9U32)sizeof(ET9BOOL)*dwArraySize);
	(*env)->ReleaseBooleanArrayElements(env, (jbooleanArray)jobj_array, (jboolean *)_pjobj_array, (jint)0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL GetByteObjectArray(JNIEnv *env, jclass jcls, ET9U8 *nat_array, jobject jobj_array,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	ET9U8 *_pjobj_array = (ET9U8 *)(*env)->GetByteArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)nat_array,(ET9U8  const *)_pjobj_array,(ET9U32)sizeof(ET9U8)*dwArraySize);
	(*env)->ReleaseByteArrayElements(env, jobj_array, (jbyte *)_pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL GetCharObjectArray(JNIEnv *env, jclass jcls, ET9U16 *nat_array, jobject jobj_array,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	ET9U16 *_pjobj_array =(ET9U16 *) (*env)->GetCharArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)nat_array,(ET9U8  const *)_pjobj_array,(ET9U32)sizeof(ET9U16)*dwArraySize);
	(*env)->ReleaseCharArrayElements(env, jobj_array,(jchar*) _pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL GetShortObjectArray(JNIEnv *env, jclass jcls, ET9U16 *nat_array, jobject jobj_array,int max_array)
{
	ET9U16 *_pjobj_array;
	jint dwArraySize;

	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;

	dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	_pjobj_array =(ET9U16 *) (*env)->GetShortArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)nat_array,(ET9U8  const *)_pjobj_array,(ET9U32)sizeof(ET9U16)*dwArraySize);
	(*env)->ReleaseShortArrayElements(env, jobj_array, (jshort*)_pjobj_array, 0);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL GetIntObjectArray(JNIEnv *env, jclass jcls, ET9INT *nat_array, jobject jobj_array,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	ET9INT *_pjobj_array =(ET9INT *) (*env)->GetIntArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)nat_array,(ET9U8  const *)_pjobj_array,(ET9U32)sizeof(ET9INT)*dwArraySize);
	(*env)->ReleaseIntArrayElements(env, jobj_array,(jint*) _pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL GetLongObjectArray(JNIEnv *env, jclass jcls, ET9U32 *nat_array, jobject jobj_array,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	ET9U32 *_pjobj_array = (ET9U32 *)(*env)->GetLongArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)nat_array,(ET9U8  const *)_pjobj_array,(ET9U32)sizeof(ET9U32)*dwArraySize);
	(*env)->ReleaseLongArrayElements(env, jobj_array,(jlong*) _pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL GetFloatObjectArray(JNIEnv *env, jclass jcls, jfloat *nat_array, jobject jobj_array,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	jfloat *_pjobj_array = (jfloat *)(*env)->GetFloatArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)nat_array,(ET9U8  const *)_pjobj_array,(ET9U32)sizeof(jfloat)*dwArraySize);
	(*env)->ReleaseFloatArrayElements(env, jobj_array,(jfloat*) _pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL GetDoubleObjectArray(JNIEnv *env, jclass jcls, jdouble *nat_array, jobject jobj_array,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	jdouble *_pjobj_array =(jdouble *) (*env)->GetDoubleArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)nat_array,(ET9U8  const *)_pjobj_array,(ET9U32)sizeof(jdouble)*dwArraySize);
	(*env)->ReleaseDoubleArrayElements(env, jobj_array,(jdouble *) _pjobj_array, 0);
	return ET9STATUS_NONE;
}

/*----------------------------------------------------------------------------
 * Set <Type> object Array Function
 *----------------------------------------------------------------------------*/
ET9STATUS ET9FARCALL SetBooleanObjectArray(JNIEnv *env, jclass jcls,jobject  jobj_array, ET9BOOL* nat_array ,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;

	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	
	ET9BOOL *_pjobj_array =(ET9BOOL *) (*env)->GetBooleanArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)_pjobj_array,(ET9U8  const *)nat_array,(ET9U32)sizeof(ET9BOOL)*dwArraySize);	
	(*env)->ReleaseBooleanArrayElements(env, jobj_array,(jboolean*) _pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL SetByteObjectArray(JNIEnv *env, jclass jcls,jobject  jobj_array, ET9U8* nat_array ,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;

	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	
	ET9U8 *_pjobj_array =(ET9U8 *) (*env)->GetByteArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)_pjobj_array,(ET9U8  const *)nat_array,(ET9U32)sizeof(ET9U8)*dwArraySize);	
	(*env)->ReleaseByteArrayElements(env, jobj_array,(jbyte*) _pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL SetCharObjectArray(JNIEnv *env, jclass jcls,jobject  jobj_array, ET9U16* nat_array ,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;

	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	
	ET9U16 *_pjobj_array =(ET9U16 *) (*env)->GetCharArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)_pjobj_array,(ET9U8  const *)nat_array,(ET9U32)sizeof(ET9U16)*dwArraySize);	
	(*env)->ReleaseCharArrayElements(env, jobj_array, (jchar*)_pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL SetShortObjectArray(JNIEnv *env, jclass jcls,jobject  jobj_array, ET9U16* nat_array ,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;

	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	
	ET9U16 *_pjobj_array = (ET9U16 *)(*env)->GetShortArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)_pjobj_array,(ET9U8  const *)nat_array,(ET9U32)sizeof(ET9U16)*dwArraySize);	
	(*env)->ReleaseShortArrayElements(env, jobj_array, (jshort*)_pjobj_array, 0);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL SetIntObjectArray(JNIEnv *env, jclass jcls,jobject  jobj_array, ET9INT* nat_array ,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;

	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	
	ET9INT *_pjobj_array = (ET9INT *)(*env)->GetIntArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)_pjobj_array,(ET9U8  const *)nat_array,(ET9U32)sizeof(ET9INT)*dwArraySize);	
	(*env)->ReleaseIntArrayElements(env, jobj_array,(jint*) _pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL SetLongObjectArray(JNIEnv *env, jclass jcls,jobject  jobj_array, ET9U32* nat_array ,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;

	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	
	ET9U32 *_pjobj_array = (ET9U32 *)(*env)->GetLongArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)_pjobj_array,(ET9U8  const *)nat_array,(ET9U32)sizeof(ET9U32)*dwArraySize);	
	(*env)->ReleaseLongArrayElements(env, jobj_array, (jlong*)_pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL SetFloatObjectArray(JNIEnv *env, jclass jcls,jobject  jobj_array, jfloat* nat_array ,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;

	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	
	jfloat *_pjobj_array = (jfloat *)(*env)->GetFloatArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)_pjobj_array,(ET9U8  const *)nat_array,(ET9U32)sizeof(jfloat)*dwArraySize);	
	(*env)->ReleaseFloatArrayElements(env, jobj_array,(jfloat*) _pjobj_array, 0);
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL SetDoubleObjectArray(JNIEnv *env, jclass jcls,jobject  jobj_array, jdouble* nat_array ,int max_array)
{
	if(env == NULL || jobj_array == NULL)
		return ET9STATUS_INVALID_MEMORY;

	jint dwArraySize =(*env)->GetArrayLength(env, jobj_array);
	if(dwArraySize > max_array){
		dwArraySize = max_array;
	}
	
	jdouble *_pjobj_array = (jdouble *)(*env)->GetDoubleArrayElements(env, jobj_array, NULL);
	_ET9ByteCopy((ET9U8*)_pjobj_array,(ET9U8  const *)nat_array,(ET9U32)sizeof(jdouble)*dwArraySize);	
	(*env)->ReleaseDoubleArrayElements(env, jobj_array, (jdouble*)_pjobj_array, 0);
	return ET9STATUS_NONE;
}
