midputilkni.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 427 行

C
427
字号
/* * * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. *//** * @file * * This file is for utility function that depend on KNI VM functions * so that other files do not have to be dependent on the VM. */#include <kni.h>#include <midp_logging.h>#include <midpMalloc.h>#include <midpString.h>#include <midpUtilKni.h>#include <string.h>#include <pcsl_memory.h>#if ENABLE_DEBUG/* some scratch areas for use during debugging */int      scratchInt1;int      scratchInt2;jobject  scratchObject1;jobject  scratchObject2;jobject *scratchHandle1 = &scratchObject1;jobject *scratchHandle2 = &scratchObject2;#endif/** * Gets the KNI field ID for an instance field of a class and checks it for * validity. See KNI_GetFieldID for further information. * * @param classHandle the handle to the containing object's class * @param name the field's name * @param signature the field's type */jfieldIDmidp_get_field_id(KNIDECLARGS jclass classHandle,                  const char* name,                  const char* signature){    jfieldID id = KNI_GetFieldID(classHandle, name, signature);    if (id == NULL) {        REPORT_CRIT3(LC_CORE,            "midp_get_field_id: can't find field, clazz=0x%x name=%s sig=%s",            (unsigned int)classHandle, name, signature);    }    return id;}/** * Gets the KNI field ID for a static field of a class and checks it for * validity. See KNI_GetStaticFieldID for further information. * * @param classHandle the handle to the containing class * @param name the field's name * @param signature the field's type */jfieldIDmidp_get_static_field_id(KNIDECLARGS jclass classHandle,                         const char* name,                         const char* signature){    jfieldID id = KNI_GetStaticFieldID(classHandle, name, signature);    if (id == NULL) {        REPORT_CRIT3(LC_CORE,            "midp_get_static_field_id: "            "can't find field, clazz=0x%x name=%s sig=%s",            (unsigned int)classHandle, name, signature);    }    return id;}/** * Get a String from a field of an object and converts it to pcsl_string. * * @param obj a handle to Java object whose field will be set * @param classObj handle of the object's class * @param pszFieldName field name * @param fieldHandle handle where to put the resulting jstring * @param newValue a handle to the new Java value of the field * @param result pointer to the location where the result must be saved * * @return status of the operation */pcsl_string_status midp_get_string_field(KNIDECLARGS jobject obj, jclass classObj,                                  char* pszFieldName, jobject fieldHandle,                                  pcsl_string* result) {    KNI_GetObjectField(obj, midp_get_field_id(KNIPASSARGS classObj, pszFieldName,        "Ljava/lang/String;"), fieldHandle);    return midp_jstring_to_pcsl_string(fieldHandle, result);}/** * Set a jobject field from Java native functions. * * Always use KNI to set an object field instead of setting it directly * using SNI access, since there is more to setting a object in a field * than just moving a reference, there is a flag to tell the the garbage * collector that the field is set to an object and if this flag is not * set then the collector not count the field as a reference which can * lead to premature collection of the object the field is referencing * and then a crash since the field will reference will not be null, it * will be unchanged and invalid. * * @param obj a handle to Java object whose field will be set * @param fieldName field name * @param fieldSignature field signature string * @param newValue a handle to the new Java value of the field */void midp_set_jobject_field(KNIDECLARGS jobject obj,			    const char *fieldName, const char *fieldSignature,			    jobject newValue) {    if (KNI_IsNullHandle(obj)) {        return;    }    KNI_StartHandles(1);    KNI_DeclareHandle(clazz);    KNI_GetObjectClass(obj, clazz);    KNI_SetObjectField(obj,		       midp_get_field_id(KNIPASSARGS 					 clazz, fieldName, fieldSignature),		       newValue);    KNI_EndHandles();}/** * Create a new MIDP string from a KNI String object. * If KNI String is null, an NULL_LEN length MidpString will be returned. * If out of memory a OUT_OF_MEM_LEN length MidpString will be returned. * The caller is responsible for calling midpFreeString() after use. * This function should not be used directly, * use the midpNewString macro. * * @param jStringHandle KNI Java String object handle * @param filename provided by the midpNewString macro * @param line provided by the midpNewString macro * * @return a new unicode string */MidpString midpNewStringImpl(jstring jStringHandle, char* filename,       int line) {    MidpString result;    (void)filename;                               /* Avoid compiler warnings */    (void)line;                                   /* Avoid compiler warnings */    result.data = NULL;    result.len  = KNI_GetStringLength(jStringHandle);    if (result.len < 0) {        result.len = NULL_LEN;    } else if (result.len > 0) {    	result.data = (jchar*)midpMallocImpl(result.len * sizeof (jchar),					     filename, line);	if (result.data == NULL) {            result.len = OUT_OF_MEM_LEN;	} else {	    KNI_GetStringRegion(jStringHandle, 0, result.len, result.data);	}    }    return result;}/** * Create a new MIDP string from a KNI CharArray object. * The caller is responsible for calling midpFreeString() after use. * This function should not be used directly, * use the midpNewStringFromArray macro. * * @param jCharArrayHandle handle to a jchar array * @param length desired length of the result * @param filename provided by the midpNewStringFromArray macro * @param line provided by the midpNewStringFromArray macro * * @return a new unicode string */MidpString midpNewStringFromArrayImpl(jcharArray jCharArrayHandle, int length,				      char* filename, int line) {    MidpString result;    (void)filename;                               /* Avoid compiler warnings */    (void)line;                                   /* Avoid compiler warnings */    result.data = NULL;    result.len  = length;    if (result.len < 0) {        result.len = NULL_LEN;    } else if (result.len > 0) {    	result.data = (jchar*)midpMallocImpl(result.len * sizeof (jchar),					     filename, line);	if (result.data == NULL) {            result.len = OUT_OF_MEM_LEN;	} else {	    KNI_GetRawArrayRegion(jCharArrayHandle, 0,				  result.len * sizeof(jchar),				  (jbyte *)result.data);	}    }    return result;}/** * Create pcsl_string from the specified Java String object. * The caller is responsible for freeing the created pcsl_string when done. * * @param java_str pointer to the Java String instance * @param pcsl_str pointer to the pcsl_string instance * @return status of the operation */pcsl_string_status midp_jstring_to_pcsl_string(jstring java_str,					       pcsl_string * pcsl_str) {  if (pcsl_str == NULL) {    return PCSL_STRING_EINVAL;  }  if (KNI_IsNullHandle(java_str)) {    * pcsl_str = PCSL_STRING_NULL;    return PCSL_STRING_OK;  } else {    const jsize length  = KNI_GetStringLength(java_str);    if (length < 0) {      * pcsl_str = PCSL_STRING_NULL;      return PCSL_STRING_ERR;    } else if (length == 0) {      * pcsl_str = PCSL_STRING_EMPTY;      return PCSL_STRING_OK;    } else {      jchar * buffer = pcsl_mem_malloc(length * sizeof(jchar));      if (buffer == NULL) {	* pcsl_str = PCSL_STRING_NULL;	return PCSL_STRING_ENOMEM;      }      KNI_GetStringRegion(java_str, 0, length, buffer);      {	pcsl_string_status status =	  pcsl_string_convert_from_utf16(buffer, length, pcsl_str);	pcsl_mem_free(buffer);	return status;      }    }  }}/** * Create pcsl_string from the specified KNI CharArray object. * The caller is responsible for freeing the created pcsl_string when done. * * @param java_arr pointer to the KNI CharArray instance * @param length length of the text in the CharArray * @param pcsl_str pointer to the pcsl_string instance * @return status of the operation */pcsl_string_statusmidp_jchar_array_to_pcsl_string(jcharArray java_arr, jint length,                                pcsl_string * pcsl_str) {    if (pcsl_str == NULL) {        return PCSL_STRING_EINVAL;    }    if (KNI_IsNullHandle(java_arr)) {        *pcsl_str = PCSL_STRING_NULL;        return PCSL_STRING_OK;    } else if (length < 0) {        *pcsl_str = PCSL_STRING_NULL;        return PCSL_STRING_ERR;    } else if (length == 0) {        *pcsl_str = PCSL_STRING_EMPTY;        return PCSL_STRING_OK;    } else {        jchar * buffer = pcsl_mem_malloc(length * sizeof(jchar));        if (buffer == NULL) {              * pcsl_str = PCSL_STRING_NULL;            return PCSL_STRING_ENOMEM;        }          KNI_GetRawArrayRegion(java_arr, 0,                                          length * sizeof(jchar),                                          (jbyte *) buffer);        {            pcsl_string_status status =                  pcsl_string_convert_from_utf16(buffer, length, pcsl_str);              pcsl_mem_free(buffer);            return status;        }    }}/** * Create Java String object from the specified pcsl_string. * * @param pcsl_str pointer to the pcsl_string instance * @param java_str pointer to the Java String instance * @return status of the operation */pcsl_string_status midp_jstring_from_pcsl_string(KNIDECLARGS						 const pcsl_string * pcsl_str,						 jstring java_str) {  if (pcsl_str == NULL) {    KNI_ReleaseHandle(java_str);    return PCSL_STRING_EINVAL;  } else {    const jsize length = pcsl_string_utf16_length(pcsl_str);    if (length < 0) {      KNI_ReleaseHandle(java_str);      return PCSL_STRING_EINVAL;    } else {      const jchar * buffer = pcsl_string_get_utf16_data(pcsl_str);      if (buffer == NULL) {	KNI_ReleaseHandle(java_str);	return PCSL_STRING_ERR;      } else {	KNI_NewString(buffer, length, java_str);	return PCSL_STRING_OK;      }    }  }}/** * Convert a C string to a pcsl_string string. * * @param in C string specifying the text to be copied to the out parameter * @param out pcsl_string to receive a copy of the text specified by the in parameter * * @return jchar string */pcsl_string_status pcsl_string_from_chars(const char* in, pcsl_string* out) {    return pcsl_string_convert_from_utf8((jbyte*)in, strlen(in), out);}/** * Allocates a jchar array and copies all Unicode characters * from the given java.lang.String object (specified by jStringHandle) * to the allocated array. * A pointer to the array is stored in pAddr. * The caller MUST free the allocated array with midpFree() after use. * * If the given java.lang.String is null, NULL_LEN will be returned * and pAddr will be set to NULL. * If out of memory, OUT_OF_MEM_LEN will be returned * and pAddr will be set to NULL. * * @param jStringHandle KNI Java String object handle * @param pAddr points to a jchar* variable receiving the address of the buffer *              with a new unicode string. The caller MUST free this memory *              using midpFree when it's not needed anymore. *              Receives NULL if no memory has been allocated *              (error or null string). * * @return the new unicode string length, or one of the values: *          NULL_LEN if the string is null *          OUT_OF_MEM_LEN in the case of out-of-memory error */jint midp_jstring_to_address_and_length(jstring jStringHandle, jchar* * pAddr) {    jchar* result_data;    jint result_len;    result_data = NULL;    result_len  = KNI_GetStringLength(jStringHandle);    if (result_len < 0) {        result_len = NULL_LEN;    } else if (result_len > 0) {    	result_data = (jchar*)midpMalloc(result_len * sizeof (jchar));        if (result_data == NULL) {            result_len = OUT_OF_MEM_LEN;        } else {            KNI_GetStringRegion(jStringHandle, 0, result_len, result_data);        }    }    *pAddr = result_data;    return result_len;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?