Java的String使用的16位的Unicode字符(UTF-16),在C/C++中一般会用char*指向string(这意味着strings在其中往往会是ASCII或者UTF-8格式).因此在JNI中,java的String必须在被使用前转换成C/C++可以使用的格式。而在JNI中,被使用后的C/C++ String必须释放掉,否则会引起内存泄漏。
有一个简单的例子
在java代码中
public class testMine {
public staticnative void handleMyString(String str);
}
在jni的C代码中,
void JNICALLJava_com_test_testMine_handleMyString(JNIEnv * env, jclass cla, jstring js)
{
constchar* s = (*env)->GetStringUTFChars(env,js, NULL);
if(s != NULL) {
…………..// 做所要进行的处理.
// 释放string
(*env)->ReleaseStringUTFChars(env,js, s);
}
}
JNI有好一些对string进行 读取/释放 的方法,如下
GetStringChars(), ReleaseStringChars();GetStringUTFChars(),ReleaseStringUTFChars();GetStringCritical(), ReleaseStringCritical().
还有两个方法,在调用的时候并不分配内存,因此不需要释放,建议使用:GetStringRegion和GetStringUTFRegion.