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

lxzj1118 lxzj1118 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近正在做从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);

//给类成员赋值
env->SetBooleanField(joInfo, jfb, mi.b);

env->SetCharField(joInfo, jfc, (jchar)mi.c);

env->SetDoubleField(joInfo, jfd, mi.d);

env->SetIntField(joInfo, jfi, mi.i);

jbyteArray jarr = env->NewByteArray(nTmpLen);
jbyte *jby = env->GetByteArrayElements(jarr, 0);
memcpy(jby, mi.arr, nTmpLen);
env->SetByteArrayRegion(jarr, 0, nTmpLen, jby);
env->SetObjectField(joInfo, jfa, jarr);

jstring jstrTmp = env->NewStringUTF(chTmp);
env->SetObjectField(joInfo, jfs, jstrTmp);

env->SetObjectField(joInfo, jfrec, joRec);

return joInfo;
}
***************************************************************

问题:
如果我把MyInfo的类成员改成对象数组Record[]的话,如下所示
public class MyInfo {
public boolean b;
public char c;
public double d;
public int i;
public byte[] array;
public String s;
public Record[] rec;
}
在 3. 编写C库
5) C结构体类型与Java 类转换实例
Java_com_jinhill_util_NativeModule_getInfo所列举的例子该如何修改?
也可直接发邮件给我,邮箱:lxzj1118@126.com ,谢谢
...全文

相关推荐

评论 21
收藏 已收藏
分享
返回顶部
lxzj1118
Java 51,407 成员 86,127 内容