假设有这样一个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;
}
下一篇将介绍在回调函数中如何使用数组