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

来源:互联网 发布:淘宝在哪里领取优惠卷 编辑:程序博客网 时间:2024/05/01 10:30

网上的文章大部分参差不齐,有的这样写有的那样写,多多少少有 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;}
原创粉丝点击