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

5 篇文章 0 订阅

在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         




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值