最近正在做从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);