1, 在本地方法中访问Java字符串
Java程序向本地方法传递String是以jstring
的形式,它不同于C的字符串类型(
char *),如果你在代码中直接打印jstring,很可能在虚拟机中引起冲突。例如就不能
象这样使用Jstring:
本地方法代码必须使用Jni函数把Java字符串转化为本地字符串。Jni支持本地Unicode 和 UTF-8字符串的转换。
访问Java字符串:你的本地方法需要调用GetStringUTFChars
来正确打印从Java程序中传来的字符串。GetStringUTFChars把基于
Unicode的Java字符串转化为UTF-8字符串,在jstring
转化为
UTF-8字符串后,你就可以直接把这个转化后的字符串传递给大多数C语言函数,像printf
,例如:
JNIEXPORT jstring JNICALLJava_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt){ char buf[128]; const char *str = (*env)->GetStringUTFChars(env, prompt, 0); printf("%s", str); (*env)->ReleaseStringUTFChars(env, prompt, str); ...
本地方法也能够通过Jni函数NewStringUTF构造一个新的字符串,例如:
... scanf("%s", buf); return (*env)->NewStringUTF(env, buf);}
使用指针JNIEnv:本地方法必须通过指针访问和操作Java对象,如String!
其他访问Java字符串的Jni函数:
GetStringChars
:
takes the Java string and returns a pointer to an array of Unicode characters that comprise the string.
ReleaseStringChars
:释放由
Unicode字符组成的数组指针。
NewString
:从由
Unicode字符组成的数组中构造一个新Java String对象;
GetStringLength
:返回由
Unicode字符组成数组形式的字符串长度;
GetStringUTFLength
:返回
UTF-8格式的字符串的长度。