JNI:操作字符串String
![](/theme/default/default/images/main/eye-open.png)
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
1. 在C/C++本地代码中创建Java的对象
Java对象可以通过JNI的NewObject
方法在C/C++本地代码中创建。通过调用GetMethod
获取构造方法的jmethodID
,使用空字符串作为方法名称便可获取构造函数的标识,因为构造方法签名返回类型为void。示例代码展示了如何创建java/util/Date
对象,获取其getTime
方法,以及如何创建Java字符串和字符串数组对象。
2. Java字符串 & C/C++的字符串
Java中的字符串对象是Unicode(UTF-16)编码的,而C/C++可以通过JNI接口与Java字符串进行互转。C/C++代码可以创建Java字符串对象,同时可以将Java字符串转换成C/C++中的宽字符串或UTF-8字符串。
2.1 GetStringChars & GetStringUTFChars
使用GetStringChars
和GetStringUTFChars
函数可以获取jstring对象的Java字符串,分别获取UTF-16和UTF-8编码的字符串。这些函数可能会复制字符串到新内存或返回指向Java字符串内存的指针。对于是否进行了拷贝,可以通过第二个参数jboolean*
获知。获取的字符串在不需要时,应使用ReleaseStringChars
或ReleaseStringUTFChars
释放内存。
2.2 GetStringCritical
GetStringCritical
和ReleaseStringCritical
函数允许直接访问Java字符串内存,但使用期间不能调用其他JNI函数或执行可能中断当前线程的代码,以防止垃圾回收器暂停。这个方法可能增加直接返回Java字符串指针的可能性,但仍可能返回拷贝的字符串。
2.3 GetStringRegin & GetStringUTFRegion
GetStringRegion
和GetStringUTFRegion
函数用于将Java字符串内容直接拷贝到C/C++字符数组中,这需要预先由C/C++分配好的字符串空间。
2.4 其他字符串函数
JNI还提供了其他字符串相关的函数,如NewString
、NewStringUTF
、GetStringLength
和GetStringUTFLength
,用于在C/C++中操作Java字符串。
想要了解更多内容?
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)