jni层设置对象数组到java层

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JNIJava Native Interface)是Java提供的一种机制,用于实现Java与其他语言(如C++)之间的交互。在JNI中,可以使用C++代码来操作Java对象。 智能指针是一种C++中的资源管理工具,用于自动管理动态分配的内存。在JNI中,可以使用智能指针来管理Java对象的内存。 在使用JNI写入Java DTO时,可以使用智能指针NewByteArray来创建一个字节数组,并将数据写入该字节数组,然后将字节数组传递给Java DTO对象。 以下是使用JNI和智能指针NewByteArray写入Java DTO的示例代码: ```cpp #include <jni.h> #include <memory> JNIEXPORT void JNICALL Java_com_example_MyClass_writeToDTO(JNIEnv* env, jobject obj, jobject dtoObj, jbyteArray data) { // 获取DTO类及其字段ID jclass dtoClass = env->GetObjectClass(dtoObj); jfieldID fieldId = env->GetFieldID(dtoClass, "data", "[B"); // 创建智能指针NewByteArray,并获取字节数组指针 jbyteArray newArray = env->NewByteArray(env->GetArrayLength(data)); std::unique_ptr<jbyte, void(*)(JNIEnv*, jbyteArray)> arrayPtr(env, newArray); jbyte* arrayData = env->GetByteArrayElements(newArray, nullptr); // 将数据写入字节数组 jsize dataSize = env->GetArrayLength(data); jbyte* dataPtr = env->GetByteArrayElements(data, nullptr); memcpy(arrayData, dataPtr, dataSize); env->ReleaseByteArrayElements(data, dataPtr, JNI_ABORT); // 将字节数组设置到DTO对象的字段中 env->SetObjectField(dtoObj, fieldId, newArray); } ``` 在上述代码中,我们首先获取DTO类及其字段ID,然后创建智能指针NewByteArray,并获取字节数组指针。接着,我们将数据从原始的jbyteArray复制到字节数组中,并将字节数组设置到DTO对象的字段中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值