a284628487 / JniSample

0 stars 0 forks source link

字符串操作&基本数据类型数组操作 #3

Open a284628487 opened 6 years ago

a284628487 commented 6 years ago

字符串操作

NewString

利用Unicode字符数组构造新的java.lang.String对象。

jstring NewString(JNIEnv *env, const jchar *unicodeChars, jsize len);

GetStringLength

返回Java字符串的长度(Unicode字符数)。

jsize GetStringLength(JNIEnv *env, jstring string);

GetStringChars

返回指向字符串的Unicode字符数组的指针。该指针在调用ReleaseStringchars()前一直有效。如果isCopy非空,则在复制完成后将*isCopy设为JNI_TRUE。如果没有复制,则设为JNI_FALSE。

const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy);

ReleaseStringChars

通知虚拟机平台相关代码无需再访问chars。参数chars是一个指针,可通过GetStringChars()从string获得。

void ReleaseStringChars(JNIEnv *env, jstring string, const jchar *chars);

NewStringUTF

利用UTF-8字符数组构造新java.lang.String对象。

jstring NewStringUTF(JNIEnv *env, const char *bytes);

GetStringUTFLength

以字节为单位返回字符串的UTF-8长度。

jsize GetStringUTFLength(JNIEnv *env, jstring string);

GetStringUTFChars

返回指向字符串的UTF-8字符数组的指针。该数组在被ReleaseStringUTFChars()释放前将一直有效。如果isCopy不是 NULL,*isCopy在复制完成后即被设为JNI_TRUE。如果未复制,则设为JNI_FALSE。

const char* GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);

ReleaseStringUTFChars

通知虚拟机平台相关代码无需再访问utf。utf参数是一个指针,可利用GetStringUTFChars()从string获得。

void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf);

数组操作

GetArrayLength

返回数组中的元素数。

jsize GetArrayLength(JNIEnv *env, jarray array);

NewObjectArray

构造新的数组,它将保存类elementClass中的对象。所有元素初始值均设为initialElement。

jarray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement);

GetObjectArrayElement

返回Object数组的元素。

jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index);

SetObjectArrayElement

设置Object数组的元素。

void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value);

NewArray

用于构造新基本类型数组对象的一系列操作。

ArrayType New<PrimitiveType>Array(JNIEnv *env, jsize length);

GetArrayElements

返回基本类型数组体的函数。结果在调用相应的ReleaseArrayElements()函数前将一直有效。由于返回的数组可能是Java数组的副本,因此对返回数组的更改不必在基本类型数组中反映出来,直到调用了ReleaseArrayElements()。如果isCopy不是 NULL,*isCopy在复制完成后即被设为JNI_TRUE。如果未复制,则设为JNI_FALSE。

NativeType *Get<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array, jboolean *isCopy);

不管布尔数组在Java虚拟机中如何表示,GetBooleanArrayElements()将始终返回一个jboolean类型的指针,其中每一字节代表一个元素(开包表示)。内存中将确保所有其它类型的数组为连续的。

    *GetArrayElements例程*        数组类型        本地类型     
    GetBooleanArrayElements()       jbooleanArray       jboolean     
    GetByteArrayElements()      jbyteArray      jbyte    
    GetCharArrayElements()      jcharArray      jchar    
    GetShortArrayElements()     jshortArray     jshort   
    GetIntArrayElements()       jintArray       jint     
    GetLongArrayElements()      jlongArray      jlong    
    GetFloatArrayElements()     jfloatArray     jfloat   
    GetDoubleArrayElements()        jdoubleArray        jdouble  

ReleaseArrayElements

void Release<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array, NativeType *elems, jint mode);

通知虚拟机平台相关代码无需再访问elems的一组函数。elems参数是一个通过使用对应的GetArrayElements()函数由 array导出的指针。 必要时,该函数将把对elems的修改复制回基本类型数组。mode参数将提供有关如何释放数组缓冲区的信息。如果elems不是 array中数组元素的副本,mode将无效。否则,mode将具有下表所述的功能:

    基本类型数组释放模       动作   
    0       复制回内容并释放elems缓冲区     
    JNI_COMMIT      复制回内容但不释放elems缓冲区    
    JNI_ABORT       释放缓冲区但不复制回变化     

多数情况下,编程人员将把“0”传给mode参数以确保固定的数组和复制的数组保持一致。其它选项可以使编程人员进一步控制内存管理,但使用时务必慎重。

    *ReleaseArrayElements例程*        数组类型        本地类型     
    ReleaseBooleanArrayElements()       jbooleanArray       jboolean     
    ReleaseByteArrayElements()      jbyteArray      jbyte    
    ReleaseCharArrayElements()      jcharArray      jchar    
    ReleaseShortArrayElements()     jshortArray     jshort   
    ReleaseIntArrayElements()       jintArray       jint     
    ReleaseLongArrayElements()      jlongArray      jlong    
    ReleaseFloatArrayElements()     jfloatArray     jfloat   
    ReleaseDoubleArrayElements()        jdoubleArray        jdouble  

GetArrayRegion

将基本类型数组某一区域复制到缓冲区中。

void Get<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array, jsize start, jsize len, NativeType *buf);
    *GetArrayRegion例程*      数组类型        本地类型     
    GetBooleanArrayRegion()     jbooleanArray       jboolean     
    GetByteArrayRegion()        jbyteArray      jbyte    
    GetCharArrayRegion()        jcharArray      jchar    
    GetShortArrayRegion()       jshortArray     jshort   
    GetIntArrayRegion()     jintArray       jint     
    GetLongArrayRegion()        jlongArray      jlong    
    GetFloatArrayRegion()       jfloatArray     jfloat   
    GetDoubleArrayRegion()      jdoubleArray        jdouble  

SetArrayRegion例程

将基本类型数组的某一区域从缓冲区中复制回来的一组函数。

void Set<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array, jsize start, jsize len, NativeType *buf);