[JNI] jnilayerはオブジェクト配列をjavalayerに設定します

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;
}

 

おすすめ

転載: blog.csdn.net/u012906122/article/details/103835902