Android Studio 3
安卓手机
NDK操作字符串与字符串有关的操作在JNI里面把Java中的字符串当成是引用数据类型进行处理。这些引用类型并不能像原生C/C++直接拿来使用,而是需要必要的函数进行转换。如图NewString函数和NewStringUTF函数。
C++文件中创建字符串我们可以在Native代码中用NewString函数构建Unicode编码格式的字符串对象,用NewStringUTF函数构建UTF-8编码格式的字符串对象(如图:创建jstring对象返回给Java层.png)。如果有内存溢出的情况,那么result就会是NULL以通知Native代码抛出异常。NewStringUTF函数创建字符串:jstring result = _env->NewStringUTF('我是C++层的字符串');
把Java字符串转换成Native字符串NDK开发中为了在C++代码中使用Java字符串,我们需要将Java字符串进行转换成C++字符串。用GetStringChars函数将Unicode格式的Java字符串转换成C字符串;用GetStringUTFChars函数将UTF-8格式的Java字符串转成C字符串。其中第二个参数是可选参数,名字是isCopy,可以让我们确定转换后返回的C++字符串地址是指向副本还是指向堆中的固定对象。(如图:将Java字符串转换成C++字符串.png)
在C++中使用完字符串要进行释放通过GetStringChars函数和GetStringUTFChars函数获得的C++字符串,在Native代码中使用完以后要正确地释放掉(如图:释放掉获取的C++字符串.png),否则可能会引起内存溢出。JNI中为我们提供了两个类型的释放函数,用ReleaseStringChars释放Unicode编码格式的字符串,用ReleaseStringUTFChars释放UTF-8编码格式的字符串。
在Native层分配的资源一定要记得进行释放。否则会引起内存溢出。
使用JNI函数转换时,一定根据编码格式进行选择,UTF-8的格式的字符串在创建时使用NewUTFString,转换时使用GetStringUTFChars,Unicode的格式的字符串在创建时使用NewString,转换时使用GetStringChars。