jni应用(*isCopy 返回的说明)

来源:互联网 发布:程序员考试资料 编辑:程序博客网 时间:2024/06/08 14:39

在jni的一些函数中有isCopy的参数,关于jboolean *isCopy说明如下:

    /* Manifest constants.
  #define JNI_FALSE  0
  #defineJNI_TRUE   

   */

   当从const char* GetStringUTFChars(JNIEnv*env, jstringstring, jboolean *isCopy); JNI函数GetStringUTFChars函数中返回得到字符串B时,

1,如果B是原始字符串java.lang.String的一份拷贝,则isCopy 被赋值为JNI_TRUE

2,如果B是和原始字符串指向的是JVM中的同一份数据isCopy 被赋值为JNI_FALSE。当isCopy JNI_FALSE时,本地代码绝不能修改字符串的内容,否则JVM中的原始字符串也会被修改,这会打破Java语言中字符串不可变的规则。

3,通常,我们不必关心JVM是否会返回原始字符串的拷贝,只需要为isCopy传递NULL作为参数

例如:

{

char* pcTransformStr = NULL;

jboolean jbIsCopy = JNI_FALSE;

char  caCombinStr[200];


/* 开辟新的内存,然后把 Java 的 String jstrUserName 拷贝到这个内存中,
   最后返回指向这个内存地址的指针 */

pcTransformStr = (*env)->GetStringUTFChars(env,jstrUserName,&jbIsCopy);

int len = strlen(pcTransformStr);

if(len > 200)

{

 len = 200;

}

memcpy(caCombinStr,pcTransformStr,len);

(*env)->ReleaseStringUTFChars(env,jstrUserName,pcTransformStr);

/*在你使用完转换生成的字符串缓冲区之后,需要显示调用 ReleaseStringUTFChars函数,

  让 Java 虚拟机释放转换生成的字符串缓冲区空间,如果不显示的调用的话,Java 虚拟机

  中会一直保存该缓冲区空间,而不会被垃圾回收器回收,因此就会导致内存溢出。*/


return (*env)->NewStringUTF(env,caCombinStr); /****生成新的String****/

}


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

说明:一组返回基本类型数组体的函数。结果在调用相应的 Release<PrimitiveType>ArrayElements()函数前将一直有效。

    由于返回的数组可能是 Java数组的副本,因此对返回数组的更改不必在基本类型数组中反映出来,直到调用了

    Release<PrimitiveType>ArrayElements() 如果 isCopy不是 NULL*isCopy在复制完成后即被设为 JNI_TRUE。如果

    未复制,则设为JNI_FALSE         




0 0