java层:
class RECT{
int left;
int top;
int right;
int bottom;
}
public class HAND{
public RECT[] prtHands;
public HAND(){
}
}
jni层:
#define HAND_JNI_CLASS_NAME "/xxx/.../HAND"
#define RECT_JNI_CLASS_NAME "/xxx/.../RECT"
struct RECT{
int left;
int top;
int right;
int bottom;
}
struct HAND{
RECT* prtHands;
}
HAND hand;
hand.prtHands = malloc(2*sizeof(RECT));
hand.priHands[0].left = 1;
hand.priHands[0].top = 1;
hand.priHands[0].right = 1;
hand.priHands[0].bottom = 1;
hand.priHands[1].left = 2;
hand.priHands[1].top = 2;
hand.priHands[1].right = 2;
hand.priHands[1].bottom = 2;
{
//指向java层HAND类
jclass handClazz = env->FindClass(HAND_JNI_CLASS_NAME);
if (Null == handClazz)
{
return -1;
}
jobject handObj = env->NewObject(handClazz, env->GetMethodID(handClazz, "<init>", "()V"));
//hand-->handObj
NativeHAND_TO_JavaHAND(env, handObj, &hand);
env->DeleteLocalRef(handObj);
env->DeleteLocalRef(handClazz);
}
int NativeHAND_TO_JavaHAND(JNIEnv *env, jobject handObj, HAND *pHandData)
{
int res = 0;
jclass handClass = env->GetObjectClass(handObj);
{
//指向java层RECT类
jclass rectClazz = env->FindClass(RECT_JNI_CLASS_NAME);
if (Null == rectClazz)
{
return -1;
}
int arrSize = 2;
jobjectArray rectObjArray = env->NewObjectArray(arrSize, rectClazz, 0);
//pHandData->prtHands-->rectObjArray
NativeRECT_TO_JavaRECT(env, rectObjArray, pHandData->prtHands, arrSize);
char rectSignature[MAX_PATH] = {0};
sprintf(rectSignature, "[L%s;", RECT_JNI_CLASS_NAME);
jfieldID pRectField = env->GetFieldID(handClass, "prtHands", rectSignature);
//jni层设置对象数组到java层
//rectObjArray设置给handObj实例的pRectField域
env->SetObjectField(handObj, pRectField, rectObjArray);
env->DeleteLocalRef(rectObjArray);
env->DeleteLocalRef(rectClazz);
}
env->DeleteLocalRef(handClass);
return res;
}
int NativeRECT_TO_JavaRECT(JNIEnv *env, jobjectArray rectObjArray, RECT *pRectData, jint arraySize)
{
int res = 0;
for(int i=0;i<arraySize;i++){
jclass clz = env->FindClass(RECT_JNI_CLASS_NAME);
if (Null == clz)
{
return -1;
}
jobject obj = env->NewObject(clz, env->GetMethodID(clz, "<init>", "()V"));
jfieldID leftField = env->GetFieldID(clz, "left", "I");
jfieldID topField = env->GetFieldID(clz, "top", "I");
jfieldID rightField = env->GetFieldID(clz, "right", "I");
jfieldID bottomField = env->GetFieldID(clz, "bottom", "I");
env->SetIntField(obj, leftField, pRectData[i].left);
env->SetIntField(obj, topField, pRectData[i].top);
env->SetIntField(obj, rightField, pRectData[i].right);
env->SetIntField(obj, bottomField, pRectData[i].bottom);
env->SetObjectArrayElement(rectObjArray,i,obj);
env->DeleteLocalRef(clz);
env->DeleteLocalRef(obj);
}
return res;
}