在jni的一些函数中有isCopy的参数,关于jboolean *isCopy说明如下:
/* Manifest constants.
#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
/* 开辟新的内存,然后把 Java 的 String jstrUserName 拷贝到这个内存中,
pcTransformStr = (*env)->GetStringUTFChars(env,jstrUserName,
int len = strlen(pcTransformStr);
if(len > 200)
{
len = 200;
}
memcpy(caCombinStr,pcTransformStr,len);
(*env)->ReleaseStringUTFChars(env,
让 Java 虚拟机释放转换生成的字符串缓冲区空间,如果不显示的调用的话,Java 虚拟机
中会一直保存该缓冲区空间,而不会被垃圾回收器回收,
return (*env)->NewStringUTF(env,
}
NativeType *Get<PrimitiveType>ArrayElements (JNIEnv *env, ArrayType array, jboolean*isCopy);
说明:一组返回基本类型数组体的函数。结果在调用相应的 Release<PrimitiveType>ArrayElements()函数前将一直有效。
由于返回的数组可能是 Java数组的副本,因此对返回数组的更改不必在基本类型数组中反映出来,直到调用了
Release<PrimitiveType>ArrayElements()。 如果 isCopy不是 NULL,*isCopy在复制完成后即被设为 JNI_TRUE。如果
未复制,则设为JNI_FALSE。