假设有这样一个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\n",i,*(buf+i)); } env->ReleaseCharArrayElements(buffer, array, 0);//释放资源 res = send(buf, length);//调用c++的send函数 free(buf);//释放内存空间 buf = NULL; return res; }