android 中java与JNI数据交互,androidjni
分享于 点击 43314 次 点评:182
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中注意释放内存,防止内存泄漏。
相关文章
- 暂无相关文章
用户点评