当前位置: 代码迷 >> Java相关 >> 急JNI传递嵌套对象数组的有关问题
  详细解决方案

急JNI传递嵌套对象数组的有关问题

热度:43   发布时间:2016-04-22 21:03:29.0
急!急!急!JNI传递嵌套对象数组的问题
最近正在做从C侧通过JNI向java侧传递数据的开发,数据的类型是类中嵌套了一个类的数组,从网上找到了一个只是嵌套普通类型传递的例子,还请哪位高手抽出宝贵时间给予解答,谢谢。

网上元例子如下所示:
***************************************************************
1.编写Java类
public class NativeModule {
    public native MyInfo getInfo();
    static {
       System.loadLibrary("NativeModule");
    }
}

其中MyInfo类定义如下:
public class Record {
    int id;
    String name;
    byte[] data;
}
public class MyInfo {
    public boolean b;
    public char c;
    public double d;
    public int i;
    public byte[] array;
    public String s;
    public Record rec;
}

C自定义结构体 
typedef struct{
    int id;
    char name[255];
    char data[255];
}Record;

typedef struct{
    BOOL b;
    char c;
    double d;
    int i;
    char arr[255];
    char sz[255];
    Record rec;
}MyInfo;

2.生成jni头文件
1)编译javac com/jinhill/util/NativeModule.java
2)javah –jni com.jinhill.util.NativeModule
这样com_jinhill_util_NativeModule.h文件就生成好了。

3.编写C库
5)C结构体类型与Java 类转换实例
JNIEXPORT jobject JNICALL Java_com_jinhill_util_NativeModule_getInfo
  (JNIEnv *env, jobject jo)
{
    wchar_t wStr[255] = {0};
    char chTmp[] = "Hello JNI";
    int nTmpLen = strlen(chTmp);

    //将C结构体转换成Java类
    MyInfo mi;
    memcpy(mi.arr, chTmp, strlen(chTmp));
    mi.b = TRUE;
    mi.c = 'B';
    mi.d = 2000.9;
    mi.i = 8;
    strcpy(mi.sz, "Hello World!");
    mi.rec.id = 2011;
    memcpy(mi.rec.data, "\x01\x02\x03\x04\x05\x06", 6);
    strcpy(mi.rec.name, "My JNI");

    //获取Java中的实例类Record
    jclass jcRec = env->FindClass("com/jinhill/util/Record");

    //int id
    jfieldID jfid = env->GetFieldID(jcRec, "id", "I");

    //String name
    jfieldID jfname = env->GetFieldID(jcRec, "name", "Ljava/lang/String;");

    //byte[] data;
    jfieldID jfdata = env->GetFieldID(jcRec, "data", "[B");

    //获取Java中的实例类
    jclass jcInfo = env->FindClass("com/jinhill/util/MyInfo");

   //获取类中每一个变量的定义
    //boolean b
    jfieldID jfb = env->GetFieldID(jcInfo, "b", "Z");

    //char c
    jfieldID jfc = env->GetFieldID(jcInfo, "c", "C");

    //double d
    jfieldID jfd = env->GetFieldID(jcInfo, "d", "D");

    //int i
    jfieldID jfi = env->GetFieldID(jcInfo, "i", "I");

    //byte[] array
    jfieldID jfa = env->GetFieldID(jcInfo, "array", "[B");

    //String s
    jfieldID jfs = env->GetFieldID(jcInfo, "s", "Ljava/lang/String;");

    //Record rec;
    jfieldID jfrec = env->GetFieldID(jcInfo, "rec", "Lcom/jinhill/util/Record;");

    //创建新的对象
    jobject joRec = env->AllocObject(jcRec); 

    env->SetIntField(joRec, jfid, mi.rec.id);

    jstring jstrn = env->NewStringUTF(mi.rec.name);
    env->SetObjectField(joRec, jfname, jstrn);

    jbyteArray jbarr = env->NewByteArray(6);  
    jbyte *jb = env->GetByteArrayElements(jbarr, 0); 
    memcpy(jb, mi.rec.data, 6);
    env->SetByteArrayRegion(jbarr, 0, 6, jb); 
    env->SetObjectField(joRec, jfdata, jbarr);

    //创建新的对象
    jobject joInfo = env->AllocObject(jcInfo);
  相关解决方案