急!急!急!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);
//给类成员赋值
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 ,谢谢
网上元例子如下所示:
***************************************************************
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 ,谢谢
...全文
相关推荐
JNI与C++数据类型传递示例(包括ArrayList对象、ArrayList嵌套返回)
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList>等。
JNI层传递数据
jni获取内部类对象,多层结构体嵌套,jni层按位接收解析数据很方便
java_jni.rar_javbi.vcom_jni 数组
Java本地调用接口DLL的编写样本,涉及数组传递,相关的JAVA和C程序均已包括。
JNA 复杂结构体传递
JNA 复杂结构体传递 结构体数组,结构体指针 查询很多资料才整合!
JNI 调用(包含复杂对象传参)
实现了jni 中java向vc dll传递list参数/String参数 对象的接口。vc代码可用vc6.0运行编译,java调用接口在src\common\CameraUtil.java里面。测试了好久才实现的(涉及到项目机密,部分资源文件没有上传,内部方法是不能运行的。但是整个接口的编写不会有问题)。上传留个念,以后可能再用到。


