之前的文章中我详细的介绍了第一个NDK程序,后面要讲讲如何使用jni的接口,实现更多的功能。
jstring相关方法
首先要讲讲jstring相关方法。
NewStringUTF
NewStringUTF
函数传入一个字符串,返回jstring对象。
1 | char p[20]="hello"; |
以上4中方式在java层中返回的都是hello。
GetStringLength和GetStringUTFLength
GetStringLength
函数顾名思义就是获取jstring的长度,它需要传入一个jstring对象,返回jstring的长度。
1 | std::string hello="123456"; |
两个方法的区别是GetStringUTFLength获取jstring的UTF-8编码字符串的长度,而GetStringLength函数是获取Unicode编码的jstring字符串长度。这里的jstring既可以通过内部创建,也可以通过外部java层传入进来,最后java层可以获取到6。
GetStringChars和ReleaseStringChars
GetStringChars
函数能将jstring对象转为16位的jchar,而≈
则能将内存释放。
1 | jstring s=env->NewStringUTF(str); //创建jstring对象 |
GetStringUTFChars和ReleaseStringUTFChars
ReleaseStringUTFChars
则是将jstring数据转为字符串,而ReleaseStringUTFChars
同样是是否内存
1 | jstring s=env->NewStringUTF("hello"); |
最后字符串p的值就是hello
GetStringUTFRegion和GetStringRegion
这对函数会把源字符串复制到一个预先分配的缓冲区内,然后会获取Unicode和UTF-8编码字符串指定范围内的内容。
1 | jstring s=env->NewStringUTF("hello"); |
这里有几点需要注意一下:首先它需要有一个预先分类号的缓冲区,所以需要先定义一个字符串内存区域,同时把指针指过去,然后在进行赋值,同时,如果这个函数还会做jstring越界检查,如果检查发现越界了,会抛出StringIndexOutOfBoundsException异常。而且由于它不会进行内存分配,所以不需要回收内存。
Array相关方法
NewTypeArray
创建固定容量的array数组,如NewIntArray,NewLongArray等。
1 | jintArray array=env->NewIntArray(3); |
java层能够获取到一个容量为3的int数组。
GetArrayLength
获取array的长度
1 | jintArray array=env->NewIntArray(3); |
java层获取到长度3
GetTypeArrayElements
将jTypeArray转化为jType *,从而可以操作里面的值。
1 | jint *as=env->GetIntArrayElements(array,NULL); |
GetPrimitiveTypeArrayRegion
将部分typearray数据复制到type数组
1 | jint nativeArray[3]; |
SetTypeArrayRegion
将type数组转化为jtypeArray
1 | jint nativeArray[3]; |