jni数组使用(一)
假设有这样一个java函数:
public int Send(char buffer[],int length)这个函数需要调用c/c++函数
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 ",i,*(buf+i)); } env->ReleaseCharArrayElements(buffer, array, 0);//释放资源 res = send(buf, length);//调用c++的send函数 free(buf);//释放内存空间 buf = NULL; return res; }
下一篇将介绍在回调函数中如何使用数组
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇: 如何在android的jni线程中实现回调