我以前是学Java的,对于C++只是明白很少的知识,所以看得越多,出现的问题也越多,我只有慢慢消化了
第四讲的第二部分:在C/C++本地代码中访问Java的String字符串对象
函数作用是取得某个jstring对象相关的Java字符串,介绍了三种类型的字符串操作函数
const jchar *GetStringChars(jstring str, jboolean *isCopy) { return functions->GetStringChars(this,str,isCopy); } const char* GetStringUTFChars(jstring str, jboolean *isCopy) { return functions->GetStringUTFChars(this,str,isCopy); } void ReleaseStringChars(jstring str, const jchar *chars) { functions->ReleaseStringChars(this,str,chars); } void ReleaseStringUTFChars(jstring str, const char* chars) { functions->ReleaseStringUTFChars(this,str,chars); }
1 )、参数
2 )、这两个函数可以两种方式进行字符串的Copy
3 )、释放拷贝的内存
在取得字符串后,当已经不再之用,需要通过ReleaseStringChars、ReleaseStringUTFChars来释放拷贝所用的内存或释放Java的String对象的引用.(上面代码中)
为了增加直接传回Java字符串的指针的可能性(不是拷贝)JDK1.2 之后增加GetStringCritical、ReleaseStringCritical
const jchar * GetStringCritical(jstring string, jboolean *isCopy) { return functions->GetStringCritical(this,string,isCopy); } void ReleaseStringCritical(jstring string, const jchar *cstring) { functions->ReleaseStringCritical(this,string,cstring); }
Java 1.2中新增函数,可以实现把Java字符串直接拷贝到C++的字符串数组中,在调用这个函数之前必须有一个C++分配出来的字符串,然后通过这个函数进行字符串的拷贝
优点:函数拷贝不需要分配内存,Java中的String内容的拷贝的开销可以忽略,所以不会造成OutOFMemoryError异常.
void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) { functions->GetStringRegion(this,str,start,len,buf); } void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) { functions->GetStringUTFRegion(this,str,start,len,buf); }
将指向Java字符串的 jstring 以相应编码 截取之后 传入 C++分配出来存储字符串的空间buf