假设有这样一个java函数:
- public int Send(char buffer[],int length)
- int send(unsigned char *buf, int len)
实现,那么用JNI该如何实现?
首先分析java的参数char buffer[ ],它在jni中的对应类型为jcharArray,说明从java传到jni的参数类型就是jcharArray。
jcharArray是一个jni数组类型,操作数组在jni中都有特定的函数,例如获取数据元素有:GetXXXArrayElements,XXX表示数据类型,可用如下数据类型替代:
jobjectArray;
jbooleanArray;
jbyteArray;
jcharArray;
jshortArray;
jintArray;
jlongArray;
jfloatArray;
jdoubleArray;
例如jcharArray的获取元素函数为:
- jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)
对应的释放函数为:
- void ReleaseCharArrayElements(jcharArray array, jchar* elems,jint mode)
另外还有获取数组指定范围元素的函数为:
- void GetCharArrayRegion(jcharArray array, jsize start, jsize len, jchar* buf)
获取到数据元素之后,还可以设置数据元素,对应的函数是Get/Set<Type>ArrayRegion
下面看看Java的send函数如何调用c++层的send函数:
- static int jni_send
- (JNIEnv *env, jobject obj, jcharArray buffer, jint length)
- {
- jchar *array;
- jboolean *buf;
- int i;
- int res;
- LOGD("jni_radio_send");
- array = env->GetCharArrayElements( buffer, NULL);//复制数组元素到array内存空间
- if(array == NULL){
- LOGE("jni_radio_send: GetCharArrayElements error.");
- return 0;
- }
- buf = (jboolean *)calloc(length , sizeof(jboolean));//开辟jboolean类型的内存空间,jboolean对应的c++类型为unsigned char
- if(buf == NULL){
- LOGE("jni_radio_send: calloc error.");
- return 0;
- }
- for(i=0; i < length; i++){//把jcharArray的数据元素复制到buf所指的内存空间
- *(buf + i) = (jboolean)(*(array + i));
- //LOGD("buf[%d]=%c\n",i,*(buf+i));
- }
- env->ReleaseCharArrayElements(buffer, array, 0);//释放资源
- res = send(buf, length);//调用c++的send函数
- free(buf);//释放内存空间
- buf = NULL;
- return res;
- }
下一篇将介绍在回调函数中如何使用数组