JNI返回自定义结构体数组到Java

网上的文章大部分参差不齐,有的这样写有的那样写,多多少少有 bug,然后就自己探索了一下,基本下面这种写法应该算比较标准的,有任何问题可以评论交流下。

Java层

public class myInfo {
    public String fileType;
    public long fileSize;
    public int  result;
    public long eConsumeTime;
    public long dConsumeTime;

    @Override
    public String toString()
    {
       return ;
    }
}

Native层

头文件

//成员变量与Java层一一对应
typedef struct cppInfo
{
    char *fileType;
    long fileSize;
    int  result;
    long eConsumeTime;
    long dConsumeTime;
}mycppInfo;

cpp文件

jobjectArray getLogInfo(JNIEnv *env, jobject thiz){
    //初始化数组
    jobjectArray logInfo = NULL;
    jsize logInfoLen = 1234;

    //获取Java中的对应的实例类
    jclass jniInfo = (env)->FindClass("com/example/myInfo");

    //初始化返回数组
    logInfo = (env)->NewObjectArray(logInfoLen, jniInfo, NULL);

    //获取类构造函数
    jmethodID objectClassInitID = (env)->GetMethodID(jniInfo, "<init>", "()V");
    jobject  objectNewEng;

    //获取类中每一个变量的定义
    jfieldID fileType = (env)->GetFieldID(jniInfo,
                                         "fileType",
                                         "Ljava/lang/String;");
    jfieldID fileSize = (env)->GetFieldID(jniInfo, "fileSize", "J");
    jfieldID Result = (env)->GetFieldID(jniInfo, "result", "I");
    jfieldID eConsumeTime = (env)->GetFieldID(jniInfo, "eConsumeTime", "J");
    jfieldID dConsumeTime = (env)->GetFieldID(jniInfo,"dConsumeTime", "J");

    //给每一个实例的变量赋值,添加到数组中
    for(int  i = 0; i < logInfoLen; i++)
    {
        //初始化类
        objectNewEng = (env)->NewObject(jniInfo, objectClassInitID);
        //赋值操作
        (env)->SetObjectField(objectNewEng,fileType,(env)->NewStringUTF(mycppInfo[i].fileType));
        (env)->SetLongField(objectNewEng, fileSize, mycppInfo[i].fileSize);
        (env)->SetIntField(objectNewEng, Result, mycppInfo[i].result);
        (env)->SetLongField(objectNewEng, eConsumeTime, mycppInfo[i].eConsumeTime);
        (env)->SetLongField(objectNewEng, dConsumeTime, mycppInfo[i].dConsumeTime);
        //添加到objcet数组中
        (env)->SetObjectArrayElement(logInfo, i, objectNewEng);
    }
    return logInfo;
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值