java层jar包:
package com.kaixin;
public class Java2Jni{
public static class Data{
public int nSrcLen; //[IN]
public byte[] bSrcData; //[IN]
public int nDstLen; //[OUT]
public byte[] bDstData; //[OUT]
}
public boolean convertData(Data data){
if(convertData(data) == -1){
return false;
}
return true;
}
private native int ConvertData(Data data);
}
JNI层:
#include <jni.h>
JNIEXPORT jint JNICALL Java_com_kaixin_Java2Jni(JNIEnv *env, jobject obj,jobject dataObj)
{
if(NULL == env||NULL == obj || NULL == dataObj)
{
return -1;
}
jclass dataCls = env->GetObjectClass(dataObj)
jfieldID jfieldSrcLen = env->GetFieldID(dataCls , "nSrcLen", "I");
jfieldID jfieldSrcData = env->GetFieldID(dataCls , "bSrcData", "[B");
jfieldID jfieldDstLen = env->GetFieldID(dataCls , "nDstLen", "I");
jfieldID jfieldDstData = env->GetFieldID(dataCls , "bDstData", "[B");
//java层int数据传递给jni
int nSrcLen = env->GetIntField(dataObj,jfieldSrcLen);
jbyteArray jSrcDataArray = (jbyteArray)env->GetObjectField
(dataObj,jfieldSrcData);
if(NULL == jSrcDataArray)
{
return -1;
}
//java层数组数据传递给jni
jbyte *pSrcData = env->GetByteArrayElements(jSrcDataArray,0);
//jni层拿到java层数据后,需要释放
env->ReleaseByteArrayElements();
//底层的Int型数据传递给java层
env->SetIntField(dataObj,jfieldDstLen,25);//25传递给java层
jbyteArray jDstDataArray = (jbyteArray)env->GetObjectField
(dataObj,jfieldDstData);
if(NULL == jDstDataArray)
{
return -1;
}
char* pDstData = new char[25];//jni层的值
//底层的pDstData数组传递给java层
env->SetByteArrayRegion(jDstDataArray,0,
25,(jbyte*)pDstData);
env->SetObjectField(dataObj,jfieldDstData,jDstDataArray);
if(NULL != pDstData)
{
delete []pDstData;
pDstData= NULL;
}
env->DeleteLocalRef(dataObj);
return 0;
}