android 中java与JNI数据交互

来源:互联网 发布:java开发简历自我评价 编辑:程序博客网 时间:2024/05/29 06:38

在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->wbufferwbody = (*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中注意释放内存,防止内存泄漏。

原创粉丝点击