欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

android 中java与JNI数据交互,androidjni

来源: javaer 分享于  点击 31490 次 点评:73

android 中java与JNI数据交互,androidjni


在android编程中,经常要使用到JNI调用native方法,这时就无法避免要解决java与native数据交互的问题。

下面是一个数据从java传递给JNI,处理之后在传递给java数据的例子(java ->JNI ->java)
在java中定义一个本地方法:
public native int DevICCardThreadCommand(byte cardno,byte[] wbuf, int wlen, byte[] rbuf,int[] rlen);
其中wbuf、wlen是java传递给JNI的数据,rbuf、rlen是JNI传递给java的数据。
下面是该本地方法在JNI中的实现:

JNIEXPORT jint JNICALL Java_xgd_android_ICCardAPI_DevICCardThreadCommand
  (JNIEnv *env, jobject thiz, jbyte cardno, jbyteArray wbuf, jint wlen, jbyteArray rbuf, jintArray rlen){
	int ret = -1;
	jbyte *wbody;
	jbyte *body ;
	int i;
	jbyte wbuffer[wlen];
	jbyte buf[256];
	int len=0;
	jint *jLen;
	//java数据传递给JNI,wbuf->wbody->wbuffer
	wbody = (*env)->GetByteArrayElements(env, wbuf, 0);
	for(i=0; i<wlen; i++) {
		wbuffer[i] = wbody[i];
	}
	(*env)->ReleaseByteArrayElements(env, wbuf, wbody, 0);

	memset(buf,0x00,256*sizeof(jbyte));
	ret = dev_iccard_thread_command(cardno,wbuffer,wlen,buf,&len);

	//JNI数据传递给JAVA, buf->body->rbuf len->jLen->rlen[]
	body = (*env)->GetByteArrayElements(env, rbuf, 0);
	for(i=0; i<len; i++) {
		body[i] = buf[i];
	}
	(*env)->ReleaseByteArrayElements(env, rbuf, body, 0);

	jLen = (*env)->GetIntArrayElements(env, rlen, 0);

		jLen[0] = len;

	(*env)->ReleaseIntArrayElements(env, rlen, jLen, 0);


	return ret;
}

在jni中注意释放内存,防止内存泄漏。

相关文章

    暂无相关文章
相关栏目:

用户点评