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

lxzj1118 2014-04-23 02:20:27
最近正在做从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 ,谢谢
...全文
646 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
suciver 2014-05-06
  • 打赏
  • 举报
回复
引用 20 楼 lxzj1118 的回复:
非常感谢suciver一直以来的回复,总算解决啦,帮了大忙了,感动啊 为了别人可能会用到,把jni完整的代码再贴付一下供参考
问题解决了就好,赶紧结贴吧
lxzj1118 2014-05-05
  • 打赏
  • 举报
回复
非常感谢suciver一直以来的回复,总算解决啦,帮了大忙了,感动啊 为了别人可能会用到,把jni完整的代码再贴付一下供参考
JNIEXPORT jobject JNICALL Com _displayaudio _get_HistoryData(JNIEnv *env, jobject obj)

{

        HistroyInfo dhif;

        /*************

        * DateInfo*

        *************/

    //获取Java中的实例类

        jclass jcDdi = env->FindClass("com/displayaudio/DateInfo");

        //获取类中每一个变量的定义

        jfieldID jfyear = (env)->GetFieldID(jcDdi,"year","I");

        jfieldID jfmonth = (env)->GetFieldID(jcDdi,"month","I");

        jfieldID jfday = (env)->GetFieldID(jcDdi,"day","I");

        jfieldID jfhour = (env)->GetFieldID(jcDdi,"hour","I");

        jfieldID jfmin = (env)->GetFieldID(jcDdi,"min","I");

        jfieldID jfsec = (env)->GetFieldID(jcDdi,"sec","I");


        /****************

        * PositionInfo *

        ****************/

       //获取Java中的实例类

        jclass jcDpi = env->FindClass("com/displayaudio/PositionInfo");

        //获取类中每一个变量的定义

        jfieldID jflatitudes_degree = (env)->GetFieldID(jcDpi,"latitudes_degree","I");

        jfieldID jflatitudes_min = (env)->GetFieldID(jcDpi,"latitudes_min","I");

        jfieldID jflatitudes_sec = (env)->GetFieldID(jcDpi,"latitudes_sec","I");

        jfieldID jflongitude_degree = (env)->GetFieldID(jcDpi,"longitude_degree","I");

        jfieldID jflongitude_min = (env)->GetFieldID(jcDpi,"longitude_min","I");

        jfieldID jflongitude_sec = (env)->GetFieldID(jcDpi,"longitude_sec","I");


        /**************

        * HistoryData  *

        ***************/

        //获取Java中的实例类

        jclass jcDhd = env->FindClass("com/displayaudio/HistoryData");

 

        //获取类中每一个变量的定义

        //DateInfo receiveTime

        jfieldID jfreceiveTime = env->GetFieldID(jcDhd, "receiveTime", "Lcom/displayaudio/DateInfo;");

        //DateInfo provideTime

        jfieldID jfprovideTime = env->GetFieldID(jcDhd, "provideTime", "Lcom/displayaudio/DateInfo;");

        //int serviceType

        jfieldID jfserviceType = env->GetFieldID(jcDhd, "serviceType", "I");

        //PositionInfo receivePosition

        jfieldID jfreceivePosition = env->GetFieldID(jcDhd, "receivePosition", "Lcom/displayaudio/PositionInfo;");

        //int RoadNo

        jfieldID jfRoadNo = env->GetFieldID(jcDhd, "roadNo", "I");

        //int provideServiceNo

        jfieldID jfprovideServiceNo = env->GetFieldID(jcDhd, "provideServiceNo", "I");

        //PositionInfo noticePosition

        jfieldID jfnoticePosition = env->GetFieldID(jcDhd, "noticePosition", "Lcom/displayaudio/PositionInfo;");

        //PositionInfo serviceoutPosition

        jfieldID jfserviceoutPosition = env->GetFieldID(jcDhd, "serviceoutPosition", "Lcom/displayaudio/PositionInfo;");

        //int judgmentResult

        jfieldID jfjudgmentResult = env->GetFieldID(jcDhd, "judgmentResult", "I");

 

        /*************

        * HistoryInfo*

        **************/

        //获取Java中的实例类

        jclass jcDhi = env->FindClass("com/displayaudio/HistoryInfo");

        //int History_num

        jfieldID jfHistory_num = env->GetFieldID(jcDhi, "History_num", "I");

        //HistoryData History[]

        jfieldID jfHistoryData = env->GetFieldID(jcDhi, "History", "[Lcom/displayaudio/HistoryData;");

        //新建object

        jobject joDhi = env->AllocObject(jcDhi);

       

        //这里创建一个java的HistoryInfo类中的数组,容量为100,第一个数据为joDhd

        jobjectArray joRecArr = env->NewObjectArray(100,jcDhd,0);

       

        //给每一个实例的变量付值

        for(int i=0; i < _HISTORY_DATA_MAX; i++ )

        {

        //新建object

        jobject joDdi = env->AllocObject(jcDdi);

       

        env->SetIntField(joDdi, jfyear, dhif.History[i].receiveTime.year);

        env->SetIntField(joDdi, jfmonth, dhif.History[i].receiveTime.month);

        env->SetIntField(joDdi, jfday, dhif.History[i].receiveTime.day);

        env->SetIntField(joDdi, jfhour, dhif.History[i].receiveTime.hour);

        env->SetIntField(joDdi, jfmin, dhif.History[i].receiveTime.min);

        env->SetIntField(joDdi, jfsec, dhif.History[i].receiveTime.sec);

        jobject joDdi1 = env->AllocObject(jcDdi);

        env->SetIntField(joDdi1, jfyear, dhif.History[i].provideTime.year);

        env->SetIntField(joDdi1, jfmonth, dhif.History[i].provideTime.month);

        env->SetIntField(joDdi1, jfday, dhif.History[i].provideTime.day);

        env->SetIntField(joDdi1, jfhour, dhif.History[i].provideTime.hour);

        env->SetIntField(joDdi1, jfmin, dhif.History[i].provideTime.min);

        env->SetIntField(joDdi1, jfsec, dhif.History[i].provideTime.sec);

 

        //新建object

        jobject joDpi = env->AllocObject(jcDpi);

       

        env->SetIntField(joDpi, jflatitudes_degree, dhif.History[i].receivePosition.latitudes_degree);

        env->SetIntField(joDpi, jflatitudes_min, dhif.History[i].receivePosition.latitudes_min);

        env->SetIntField(joDpi, jflatitudes_sec, dhif.History[i].receivePosition.latitudes_sec);

        env->SetIntField(joDpi, jflongitude_degree, dhif.History[i].receivePosition.longitude_degree);

        env->SetIntField(joDpi, jflongitude_min, dhif.History[i].receivePosition.longitude_min);

        env->SetIntField(joDpi, jflongitude_sec, dhif.History[i].receivePosition.longitude_sec);
        jobject joDpi1= env->AllocObject(jcDpi);

        env->SetIntField(joDpi1, jflatitudes_degree, dhif.History[i].noticePosition.latitudes_degree);

        env->SetIntField(joDpi1, jflatitudes_min, dhif.History[i].noticePosition.latitudes_min);

        env->SetIntField(joDpi1, jflatitudes_sec, dhif.History[i].noticePosition.latitudes_sec);

        env->SetIntField(joDpi1, jflongitude_degree, dhif.History[i].noticePosition.longitude_degree);

        env->SetIntField(joDpi1, jflongitude_min, dhif.History[i].noticePosition.longitude_min);

        env->SetIntField(joDpi1, jflongitude_sec, dhif.History[i].noticePosition.longitude_sec);
        jobject joDpi2= env->AllocObject(jcDpi);

        env->SetIntField(joDpi2, jflatitudes_degree, dhif.History[i].serviceoutPosition.latitudes_degree);

        env->SetIntField(joDpi2, jflatitudes_min, dhif.History[i].serviceoutPosition.latitudes_min);

        env->SetIntField(joDpi2, jflatitudes_sec, dhif.History[i].serviceoutPosition.latitudes_sec);

        env->SetIntField(joDpi2, jflongitude_degree, dhif.History[i].serviceoutPosition.longitude_degree);

        env->SetIntField(joDpi2, jflongitude_min, dhif.History[i].serviceoutPosition.longitude_min);

        env->SetIntField(joDpi2, jflongitude_sec, dhif.History[i].serviceoutPosition.longitude_sec); 

 

        //新建object

        jobject joDhd = env->AllocObject(jcDhd);

       

        env->SetObjectField(joDhd, jfreceiveTime, joDdi);

        env->SetObjectField(joDhd, jfprovideTime, joDdi1);

        env->SetObjectField(joDhd, jfreceivePosition, joDpi);

        env->SetObjectField(joDhd, jfnoticePosition, joDpi1);

        env->SetObjectField(joDhd, jfserviceoutPosition, joDpi2);

        env->SetIntField(joDhd, jfserviceType, dhif.History[i].serviceType);

        env->SetIntField(joDhd, jfRoadNo, dhif.History[i].RoadNo);

        env->SetIntField(joDhd, jfprovideServiceNo, dhif.History[i].provideServiceNo);

        env->SetIntField(joDhd, jfjudgmentResult, dhif.History[i].judgmentResult);

       

        env->SetObjectArrayElement(joRecArr, i, joDhd);

       

        }

       

        //给每一个实例的变量付值

        env->SetIntField(joDhi,jfHistory_num,dhif.History_num);

        //把这个数组赋值到java的HistoryInfo对象的HistoryData属性上

        env->SetObjectField(joDhi, jfHistoryData, joRecArr);

        return joDhi;

}
suciver 2014-05-05
  • 打赏
  • 举报
回复
引用 18 楼 lxzj1118 的回复:
[quote=引用 17 楼 suciver 的回复:] joDdi和joDpi应该放在同一个循环里面创建赋值,如果是向上面那样分开的循环赋值,你变量都找不到了,你用C编译都不过了,既然error已经出现了,楼主只要看看error指向哪里就知道了。只要逻辑和语法没错,就不会有问题了。
恩 问题解决了 从log上可以看出数据传递成功 但是还是有个问题 我的数组有十个数据 循环后应该遍历十个数据才对吧(dhif.History[0].provideTime.year ~dhif.History[9].provideTime.year) 可以为什么出log上看数据始终都是传递的第一个dhif.History[0].provideTime.year的值?[/quote] 楼主再认真检查下循环创建对象和赋值,都是逻辑上的问题不会有什么难度的
lxzj1118 2014-05-05
  • 打赏
  • 举报
回复
引用 17 楼 suciver 的回复:
joDdi和joDpi应该放在同一个循环里面创建赋值,如果是向上面那样分开的循环赋值,你变量都找不到了,你用C编译都不过了,既然error已经出现了,楼主只要看看error指向哪里就知道了。只要逻辑和语法没错,就不会有问题了。
恩 问题解决了 从log上可以看出数据传递成功 但是还是有个问题 我的数组有十个数据 循环后应该遍历十个数据才对吧(dhif.History[0].provideTime.year ~dhif.History[9].provideTime.year) 可以为什么出log上看数据始终都是传递的第一个dhif.History[0].provideTime.year的值?
suciver 2014-04-30
  • 打赏
  • 举报
回复
引用 16 楼 lxzj1118 的回复:
[quote=引用 15 楼 suciver 的回复:] 你的joDdi也应该是循环创建赋值的楼主应该把 这段都放到你需要用到joDdi的循环中,这些都是基本的逻辑,楼主应该很容易就看到问题所在的
由于粘贴上面的代码太长了我就省略了,joDdi和joDpi我就是在循环创建赋值的, 才会出现上面提到的error [/quote] joDdi和joDpi应该放在同一个循环里面创建赋值,如果是向上面那样分开的循环赋值,你变量都找不到了,你用C编译都不过了,既然error已经出现了,楼主只要看看error指向哪里就知道了。只要逻辑和语法没错,就不会有问题了。
lxzj1118 2014-04-29
  • 打赏
  • 举报
回复
       //新建object
        //给每一个实例的变量付值
        for(int i=0; i < _HISTORY_DATA_MAX; i++ )
        {
        jobject joDhd = env->AllocObject(jcDhd);

        env->SetObjectField(joDhd, jfreceiveTime, joDdi);
        env->SetObjectField(joDhd, jfprovideTime, joDdi);
        env->SetObjectField(joDhd, jfreceivePosition, joDpi);
        env->SetObjectField(joDhd, jfnoticePosition, joDpi);
        env->SetObjectField(joDhd, jfserviceoutPosition, joDpi);

        env->SetIntField(joDhd, jfserviceType, dhif.History[i].serviceType);
        env->SetIntField(joDhd, jfRoadNo, dhif.History[i].RoadNo);
        env->SetIntField(joDhd, jfprovideServiceNo, dhif.History[i].provideServiceNo);
        env->SetIntField(joDhd, jfjudgmentResult, dhif.History[i].judgmentResult);
        }
红色标记内容出现如下error env->SetObjectField(joDhd, jfreceiveTime, joDdi); env->SetObjectField(joDhd, jfprovideTime, joDdi); env->SetObjectField(joDhd, jfreceivePosition, joDpi); env->SetObjectField(joDhd, jfnoticePosition, joDpi); env->SetObjectField(joDhd, jfserviceoutPosition, joDpi); Invalid arguments ' Symbol 'joDdi' could not be resolved Controller.cpp Invalid arguments ' Symbol 'joDpi' could not be resolved Controller.cpp
suciver 2014-04-29
  • 打赏
  • 举报
回复
jobject joDpi = env->AllocObject(jcDpi);你把这句话放到循环里会有问题?
lxzj1118 2014-04-29
  • 打赏
  • 举报
回复
引用 15 楼 suciver 的回复:
你的joDdi也应该是循环创建赋值的楼主应该把 这段都放到你需要用到joDdi的循环中,这些都是基本的逻辑,楼主应该很容易就看到问题所在的
由于粘贴上面的代码太长了我就省略了,joDdi和joDpi我就是在循环创建赋值的, 才会出现上面提到的error
suciver 2014-04-29
  • 打赏
  • 举报
回复
你的joDdi也应该是循环创建赋值的楼主应该把

//新建object
        jobject joDdi = env->AllocObject(jcDdi);
        env->SetIntField(joDdi, jfyear, dhif.History[i].receiveTime.year);
        env->SetIntField(joDdi, jfmonth, dhif.History[i].receiveTime.month);
        env->SetIntField(joDdi, jfday, dhif.History[i].receiveTime.day);
        env->SetIntField(joDdi, jfhour, dhif.History[i].receiveTime.hour);
        env->SetIntField(joDdi, jfmin, dhif.History[i].receiveTime.min);
        env->SetIntField(joDdi, jfsec, dhif.History[i].receiveTime.sec);
 
        env->SetIntField(joDdi, jfyear, dhif.History[i].provideTime.year);
        env->SetIntField(joDdi, jfmonth, dhif.History[i].provideTime.month);
        env->SetIntField(joDdi, jfday, dhif.History[i].provideTime.day);
        env->SetIntField(joDdi, jfhour, dhif.History[i].provideTime.hour);
        env->SetIntField(joDdi, jfmin, dhif.History[i].provideTime.min);
        env->SetIntField(joDdi, jfsec, dhif.History[i].provideTime.sec);
这段都放到你需要用到joDdi的循环中,这些都是基本的逻辑,楼主应该很容易就看到问题所在的
lxzj1118 2014-04-28
  • 打赏
  • 举报
回复
引用 10 楼 suciver 的回复:
看错了,代码格式下的注释颜色.................,楼主这里循环赋值什么情况,怎么都循环赋值给同一个对象。你应该要循环创建对象再赋值才对
感谢一直以来的回复,辛苦了。 如何循环创建对象,不是很明白,按我的理解在循环内部创建新对象后,代码会有error 可否具体举例说明下。
lxzj1118 2014-04-25
  • 打赏
  • 举报
回复
4.部分log内容如下所示: 04-25 00:36:06.028: E/dalvikvm(1311): ERROR: couldn't find native method 04-25 00:36:06.028: E/dalvikvm(1311): Requested: Lcom/displayaudio/Service;. get_HistoryData:()Lcom/displayaudio/HistroyInfo; 04-25 00:36:06.028: E/dalvikvm(1311): Candidate: Lcom/displayaudio/Service;. get_HistoryData:()Lcom/displayaudio/HistoryInfo; 04-25 00:36:06.768: W/dalvikvm(1311): No implementation found for native Lcom/displayaudio/Service;. get_HistoryData:()Lcom/displayaudio/HistoryInfo; 04-25 00:36:06.768: D/AndroidRuntime(1311): Shutting down VM 04-25 00:36:06.768: W/dalvikvm(1311): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 04-25 00:36:06.788: E/AndroidRuntime(1311): FATAL EXCEPTION: main 04-25 00:36:06.788: E/AndroidRuntime(1311): java.lang.UnsatisfiedLinkError: Native method not found: com.displayaudio.Service. get_HistoryData:()Lcom/displayaudio/HistoryInfo; 04-25 00:36:06.788: E/AndroidRuntime(1311): at com. displayaudio. Service. get_HistoryData(Native Method) 04-25 00:36:06.788: E/AndroidRuntime(1311): at com.example. test.MainActivity.onCreate(MainActivity.java:130) 04-25 00:36:06.788: E/AndroidRuntime(1311): at android.app.Activity.performCreate(Activity.java:5104) 04-25 00:36:06.788: E/AndroidRuntime(1311): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 04-25 00:36:06.788: E/AndroidRuntime(1311): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 04-25 00:36:06.788: E/AndroidRuntime(1311): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 04-25 00:36:06.788: E/AndroidRuntime(1311): at android.app.ActivityThread.access$600(ActivityThread.java:141) 04-25 00:36:06.788: E/AndroidRuntime(1311): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 04-25 00:36:06.788: E/AndroidRuntime(1311): at android.os.Handler.dispatchMessage(Handler.java:99) 04-25 00:36:06.788: E/AndroidRuntime(1311): at android.os.Looper.loop(Looper.java:137) 04-25 00:36:06.788: E/AndroidRuntime(1311): at android.app.ActivityThread.main(ActivityThread.java:5041) 04-25 00:36:06.788: E/AndroidRuntime(1311): at java.lang.reflect.Method.invokeNative(Native Method) 04-25 00:36:06.788: E/AndroidRuntime(1311): at java.lang.reflect.Method.invoke(Method.java:511) 04-25 00:36:06.788: E/AndroidRuntime(1311): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-25 00:36:06.788: E/AndroidRuntime(1311): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 04-25 00:36:06.788: E/AndroidRuntime(1311): at dalvik.system.NativeStart.main(Native Method)[/color]
lxzj1118 2014-04-25
  • 打赏
  • 举报
回复
3.//Controller.cpp JNIEXPORT jobject JNICALL Com _displayaudio _get_HistoryData(JNIEnv *env, jobject obj) { HistroyInfo dhif; dhif.History_num = 100; dhif.History[0].provideTime.year= 2014; dhif.History[0].provideTime.month= 1; dhif.History[0].provideTime.day= 1; dhif.History[0].provideTime.hour= 23; dhif.History[0].provideTime.min= 59; dhif.History[0].provideTime.sec= 59; dhif.History[0].receiveTime.year= 2050; dhif.History[0].receiveTime.month= 6; dhif.History[0].receiveTime.day= 15; dhif.History[0].receiveTime.hour= 12; dhif.History[0].receiveTime.min= 30; dhif.History[0].receiveTime.sec= 30; dhif.History[0].receivePosition.latitudes_degree= 116; dhif.History[0].receivePosition.latitudes_min= 20; dhif.History[0].receivePosition.latitudes_sec= 12; dhif.History[0].receivePosition.longitude_degree= 39; dhif.History[0].receivePosition.longitude_min= 12; dhif.History[0].receivePosition.longitude_sec= 34; dhif.History[0].noticePosition.latitudes_degree= 39; dhif.History[0].noticePosition.latitudes_min= 12; dhif.History[0].noticePosition.latitudes_sec= 34; dhif.History[0].noticePosition.longitude_degree= 116; dhif.History[0].noticePosition.longitude_min= 20; dhif.History[0].noticePosition.longitude_sec= 15; dhif.History[0].serviceoutPosition.latitudes_degree= 39; dhif.History[0].serviceoutPosition.latitudes_min= 12; dhif.History[0].serviceoutPosition.latitudes_sec= 34; dhif.History[0].serviceoutPosition.longitude_degree= 116; dhif.History[0].serviceoutPosition.longitude_min= 20; dhif.History[0].serviceoutPosition.longitude_sec= 15; dhif.History[0].serviceType= 222; dhif.History[0].RoadNo= 333; dhif.History[0].provideServiceNo= 444; dhif.History[0].judgmentResult= 1; /************* * DateInfo* *************/ //获取Java中的实例类 jclass jcDdi = env->FindClass("com/displayaudio/DateInfo"); //获取类中每一个变量的定义 jfieldID jfyear = (env)->GetFieldID(jcDdi,"year","I"); jfieldID jfmonth = (env)->GetFieldID(jcDdi,"month","I"); jfieldID jfday = (env)->GetFieldID(jcDdi,"day","I"); jfieldID jfhour = (env)->GetFieldID(jcDdi,"hour","I"); jfieldID jfmin = (env)->GetFieldID(jcDdi,"min","I"); jfieldID jfsec = (env)->GetFieldID(jcDdi,"sec","I"); //新建object jobject joDdi = env->AllocObject(jcDdi); //给每一个实例的变量付值 for(int i=0; i < _HISTORY_DATA_MAX; i++ ) { env->SetIntField(joDdi, jfyear, dhif.History[i].receiveTime.year); env->SetIntField(joDdi, jfmonth, dhif.History[i].receiveTime.month); env->SetIntField(joDdi, jfday, dhif.History[i].receiveTime.day); env->SetIntField(joDdi, jfhour, dhif.History[i].receiveTime.hour); env->SetIntField(joDdi, jfmin, dhif.History[i].receiveTime.min); env->SetIntField(joDdi, jfsec, dhif.History[i].receiveTime.sec); env->SetIntField(joDdi, jfyear, dhif.History[i].provideTime.year); env->SetIntField(joDdi, jfmonth, dhif.History[i].provideTime.month); env->SetIntField(joDdi, jfday, dhif.History[i].provideTime.day); env->SetIntField(joDdi, jfhour, dhif.History[i].provideTime.hour); env->SetIntField(joDdi, jfmin, dhif.History[i].provideTime.min); env->SetIntField(joDdi, jfsec, dhif.History[i].provideTime.sec); } /**************** * PositionInfo * ****************/ //获取Java中的实例类 jclass jcDpi = env->FindClass("com/displayaudio/PositionInfo"); //获取类中每一个变量的定义 jfieldID jflatitudes_degree = (env)->GetFieldID(jcDpi,"latitudes_degree","I"); jfieldID jflatitudes_min = (env)->GetFieldID(jcDpi,"latitudes_min","I"); jfieldID jflatitudes_sec = (env)->GetFieldID(jcDpi,"latitudes_sec","I"); jfieldID jflongitude_degree = (env)->GetFieldID(jcDpi,"longitude_degree","I"); jfieldID jflongitude_min = (env)->GetFieldID(jcDpi,"longitude_min","I"); jfieldID jflongitude_sec = (env)->GetFieldID(jcDpi,"longitude_sec","I"); //新建object jobject joDpi = env->AllocObject(jcDpi); //给每一个实例的变量付值 for(int i=0; i < _HISTORY_DATA_MAX; i++ ) { env->SetIntField(joDpi, jflatitudes_degree, dhif.History[i].receivePosition.latitudes_degree); env->SetIntField(joDpi, jflatitudes_min, dhif.History[i].receivePosition.latitudes_min); env->SetIntField(joDpi, jflatitudes_sec, dhif.History[i].receivePosition.latitudes_sec); env->SetIntField(joDpi, jflongitude_degree, dhif.History[i].receivePosition.longitude_degree); env->SetIntField(joDpi, jflongitude_min, dhif.History[i].receivePosition.longitude_min); env->SetIntField(joDpi, jflongitude_sec, dhif.History[i].receivePosition.longitude_sec); env->SetIntField(joDpi, jflatitudes_degree, dhif.History[i].noticePosition.latitudes_degree); env->SetIntField(joDpi, jflatitudes_min, dhif.History[i].noticePosition.latitudes_min); env->SetIntField(joDpi, jflatitudes_sec, dhif.History[i].noticePosition.latitudes_sec); env->SetIntField(joDpi, jflongitude_degree, dhif.History[i].noticePosition.longitude_degree); env->SetIntField(joDpi, jflongitude_min, dhif.History[i].noticePosition.longitude_min); env->SetIntField(joDpi, jflongitude_sec, dhif.History[i].noticePosition.longitude_sec); env->SetIntField(joDpi, jflatitudes_degree, dhif.History[i].serviceoutPosition.latitudes_degree); env->SetIntField(joDpi, jflatitudes_min, dhif.History[i].serviceoutPosition.latitudes_min); env->SetIntField(joDpi, jflatitudes_sec, dhif.History[i].serviceoutPosition.latitudes_sec); env->SetIntField(joDpi, jflongitude_degree, dhif.History[i].serviceoutPosition.longitude_degree); env->SetIntField(joDpi, jflongitude_min, dhif.History[i].serviceoutPosition.longitude_min); env->SetIntField(joDpi, jflongitude_sec, dhif.History[i].serviceoutPosition.longitude_sec); } /************** * HistoryData * *************** / //获取Java中的实例类 jclass jcDhd = env->FindClass("com/displayaudio/HistoryData"); //获取类中每一个变量的定义 //DateInfo receiveTime jfieldID jfreceiveTime = env->GetFieldID(jcDhd, "receiveTime", "Lcom/displayaudio/DateInfo;"); //DateInfo provideTime jfieldID jfprovideTime = env->GetFieldID(jcDhd, "provideTime", "Lcom/displayaudio/DateInfo;"); //int serviceType jfieldID jfserviceType = env->GetFieldID(jcDhd, "serviceType", "I"); //PositionInfo receivePosition jfieldID jfreceivePosition = env->GetFieldID(jcDhd, "receivePosition", "Lcom/displayaudio/PositionInfo;"); //int RoadNo jfieldID jfRoadNo = env->GetFieldID(jcDhd, "roadNo", "I"); //int provideServiceNo jfieldID jfprovideServiceNo = env->GetFieldID(jcDhd, "provideServiceNo", "I"); //PositionInfo noticePosition jfieldID jfnoticePosition = env->GetFieldID(jcDhd, "noticePosition", "Lcom/displayaudio/PositionInfo;"); //PositionInfo serviceoutPosition jfieldID jfserviceoutPosition = env->GetFieldID(jcDhd, "serviceoutPosition", "Lcom/displayaudio/PositionInfo;"); //int judgmentResult jfieldID jfjudgmentResult = env->GetFieldID(jcDhd, "judgmentResult", "I"); //新建object jobject joDhd = env->AllocObject(jcDhd); //给每一个实例的变量付值 for(int i=0; i < _HISTORY_DATA_MAX; i++ ) { env->SetObjectField(joDhd, jfreceiveTime, joDdi); env->SetObjectField(joDhd, jfprovideTime, joDdi); env->SetObjectField(joDhd, jfreceivePosition, joDpi); env->SetObjectField(joDhd, jfnoticePosition, joDpi); env->SetObjectField(joDhd, jfserviceoutPosition, joDpi); env->SetIntField(joDhd, jfserviceType, dhif.History[i].serviceType); env->SetIntField(joDhd, jfRoadNo, dhif.History[i].RoadNo); env->SetIntField(joDhd, jfprovideServiceNo, dhif.History[i].provideServiceNo); env->SetIntField(joDhd, jfjudgmentResult, dhif.History[i].judgmentResult); } /************* * HistoryInfo* **************/ //获取Java中的实例类 jclass jcDhi = env->FindClass("com/displayaudio/HistoryInfo"); //int History_num jfieldID jfHistory_num = env->GetFieldID(jcDhi, "History_num", "I"); //HistoryData History[] jfieldID jfHistoryData = env->GetFieldID(jcDhi, "History", "[Lcom/displayaudio/HistoryData;"); //新建object jobject joDhi = env->AllocObject(jcDhi); //给每一个实例的变量付值 env->SetIntField(joDhi,jfHistory_num,dhif.History_num); //这里创建一个java的HistoryInfo类中的数组,容量为100,第一个数据为joDhd jobjectArray joRecArr = env->NewObjectArray(100,jcDhd,joDhd); //把这个数组赋值到java的HistoryInfo对象的HistoryData属性上 env->SetObjectField(joDhi, jfHistoryData, joRecArr); return joDhi; }
lxzj1118 2014-04-25
  • 打赏
  • 举报
回复
万分感谢suciver的回复。我昨天试了下我的程序,但是貌似出现了问题。 小弟愚昧,没能举一反三,还请继续帮忙看看到底哪里出了问题,如下是我的代码,还请抽出宝贵时间给予解答,不胜感激。 1.类定义如下: public class PositionInfo { public int latitudes_degree; public int latitudes_min; public int latitudes_sec; public int longitude_degree ; public int longitude_min; public int longitude_sec; } public class DateInfo { public int year; public int month; public int day; public int hour; public int min; public int sec; } public class HistoryData { public DateInfo receiveTime; public DateInfo provideTime; public int serviceType; public PositionInfo receivePosition; public int roadNo; public int provideServiceNo; public PositionInfo noticePosition; public PositionInfo serviceoutPosition; public int judgmentResult; } public class HistoryInfo{ public int History_num; public HistoryData[] History; } 2.//Service.java public class Service extends IService.Stub { static { System.loadLibrary("Controller"); } public native HistoryInfo get_HistoryData(); }
suciver 2014-04-25
  • 打赏
  • 举报
回复
看错了,代码格式下的注释颜色.................,楼主这里循环赋值什么情况,怎么都循环赋值给同一个对象。你应该要循环创建对象再赋值才对
suciver 2014-04-25
  • 打赏
  • 举报
回复
楼主这个joDhd都被注释掉了可是后面的创建数组还在用它
lxzj1118 2014-04-25
  • 打赏
  • 举报
回复
JNIEXPORT jobject JNICALL Com _displayaudio _get_HistoryData(JNIEnv *env, jobject obj)
{
        HistroyInfo dhif;
        dhif.History_num = 100;
        dhif.History[0].provideTime.year= 2014;
        dhif.History[0].provideTime.month= 1;
        dhif.History[0].provideTime.day= 1;
        dhif.History[0].provideTime.hour= 23;
        dhif.History[0].provideTime.min= 59;
        dhif.History[0].provideTime.sec= 59;
        dhif.History[0].receiveTime.year= 2050;
        dhif.History[0].receiveTime.month= 6;
        dhif.History[0].receiveTime.day= 15;
        dhif.History[0].receiveTime.hour= 12;
        dhif.History[0].receiveTime.min= 30;
        dhif.History[0].receiveTime.sec= 30;
        dhif.History[0].receivePosition.latitudes_degree= 116;
        dhif.History[0].receivePosition.latitudes_min= 20;
        dhif.History[0].receivePosition.latitudes_sec= 12;
        dhif.History[0].receivePosition.longitude_degree= 39;
        dhif.History[0].receivePosition.longitude_min= 12;
        dhif.History[0].receivePosition.longitude_sec= 34;
        dhif.History[0].noticePosition.latitudes_degree= 39;
        dhif.History[0].noticePosition.latitudes_min= 12;
        dhif.History[0].noticePosition.latitudes_sec= 34;
        dhif.History[0].noticePosition.longitude_degree= 116;
        dhif.History[0].noticePosition.longitude_min= 20;
        dhif.History[0].noticePosition.longitude_sec= 15;
        dhif.History[0].serviceoutPosition.latitudes_degree= 39;
        dhif.History[0].serviceoutPosition.latitudes_min= 12;
        dhif.History[0].serviceoutPosition.latitudes_sec= 34;
        dhif.History[0].serviceoutPosition.longitude_degree= 116;
        dhif.History[0].serviceoutPosition.longitude_min= 20;
        dhif.History[0].serviceoutPosition.longitude_sec= 15;
        dhif.History[0].serviceType= 222;
        dhif.History[0].RoadNo= 333;
        dhif.History[0].provideServiceNo= 444;
        dhif.History[0].judgmentResult= 1;

        /*************
        * DateInfo*
        *************/
    //获取Java中的实例类
        jclass jcDdi = env->FindClass("com/displayaudio/DateInfo");

        //获取类中每一个变量的定义
        jfieldID jfyear = (env)->GetFieldID(jcDdi,"year","I");
        jfieldID jfmonth = (env)->GetFieldID(jcDdi,"month","I");
        jfieldID jfday = (env)->GetFieldID(jcDdi,"day","I");
        jfieldID jfhour = (env)->GetFieldID(jcDdi,"hour","I");
        jfieldID jfmin = (env)->GetFieldID(jcDdi,"min","I");
        jfieldID jfsec = (env)->GetFieldID(jcDdi,"sec","I");

        //新建object
        jobject joDdi = env->AllocObject(jcDdi);

        //给每一个实例的变量付值
        for(int i=0; i < _HISTORY_DATA_MAX; i++ )
        {
        env->SetIntField(joDdi, jfyear, dhif.History[i].receiveTime.year);
        env->SetIntField(joDdi, jfmonth, dhif.History[i].receiveTime.month);
        env->SetIntField(joDdi, jfday, dhif.History[i].receiveTime.day);
        env->SetIntField(joDdi, jfhour, dhif.History[i].receiveTime.hour);
        env->SetIntField(joDdi, jfmin, dhif.History[i].receiveTime.min);
        env->SetIntField(joDdi, jfsec, dhif.History[i].receiveTime.sec);

        env->SetIntField(joDdi, jfyear, dhif.History[i].provideTime.year);
        env->SetIntField(joDdi, jfmonth, dhif.History[i].provideTime.month);
        env->SetIntField(joDdi, jfday, dhif.History[i].provideTime.day);
        env->SetIntField(joDdi, jfhour, dhif.History[i].provideTime.hour);
        env->SetIntField(joDdi, jfmin, dhif.History[i].provideTime.min);
        env->SetIntField(joDdi, jfsec, dhif.History[i].provideTime.sec);
        }

        /****************
        * PositionInfo *
        ****************/
       //获取Java中的实例类
        jclass jcDpi = env->FindClass("com/displayaudio/PositionInfo");

        //获取类中每一个变量的定义
        jfieldID jflatitudes_degree = (env)->GetFieldID(jcDpi,"latitudes_degree","I");
        jfieldID jflatitudes_min = (env)->GetFieldID(jcDpi,"latitudes_min","I");
        jfieldID jflatitudes_sec = (env)->GetFieldID(jcDpi,"latitudes_sec","I");
        jfieldID jflongitude_degree = (env)->GetFieldID(jcDpi,"longitude_degree","I");
        jfieldID jflongitude_min = (env)->GetFieldID(jcDpi,"longitude_min","I");
        jfieldID jflongitude_sec = (env)->GetFieldID(jcDpi,"longitude_sec","I");

        //新建object
        jobject joDpi = env->AllocObject(jcDpi);

        //给每一个实例的变量付值
        for(int i=0; i < _HISTORY_DATA_MAX; i++ )
        {
        env->SetIntField(joDpi, jflatitudes_degree, dhif.History[i].receivePosition.latitudes_degree);
        env->SetIntField(joDpi, jflatitudes_min, dhif.History[i].receivePosition.latitudes_min);
        env->SetIntField(joDpi, jflatitudes_sec, dhif.History[i].receivePosition.latitudes_sec);
        env->SetIntField(joDpi, jflongitude_degree, dhif.History[i].receivePosition.longitude_degree);
        env->SetIntField(joDpi, jflongitude_min, dhif.History[i].receivePosition.longitude_min);
        env->SetIntField(joDpi, jflongitude_sec, dhif.History[i].receivePosition.longitude_sec);

        env->SetIntField(joDpi, jflatitudes_degree, dhif.History[i].noticePosition.latitudes_degree);
        env->SetIntField(joDpi, jflatitudes_min, dhif.History[i].noticePosition.latitudes_min);
        env->SetIntField(joDpi, jflatitudes_sec, dhif.History[i].noticePosition.latitudes_sec);
        env->SetIntField(joDpi, jflongitude_degree, dhif.History[i].noticePosition.longitude_degree);
        env->SetIntField(joDpi, jflongitude_min, dhif.History[i].noticePosition.longitude_min);
        env->SetIntField(joDpi, jflongitude_sec, dhif.History[i].noticePosition.longitude_sec);

        env->SetIntField(joDpi, jflatitudes_degree, dhif.History[i].serviceoutPosition.latitudes_degree);
        env->SetIntField(joDpi, jflatitudes_min, dhif.History[i].serviceoutPosition.latitudes_min);
        env->SetIntField(joDpi, jflatitudes_sec, dhif.History[i].serviceoutPosition.latitudes_sec);
        env->SetIntField(joDpi, jflongitude_degree, dhif.History[i].serviceoutPosition.longitude_degree);
        env->SetIntField(joDpi, jflongitude_min, dhif.History[i].serviceoutPosition.longitude_min);
        env->SetIntField(joDpi, jflongitude_sec, dhif.History[i].serviceoutPosition.longitude_sec);
        }  

        /**************
        * HistoryData  *
        *************** /
        //获取Java中的实例类
        jclass jcDhd = env->FindClass("com/displayaudio/HistoryData");
 
        //获取类中每一个变量的定义
        //DateInfo receiveTime
        jfieldID jfreceiveTime = env->GetFieldID(jcDhd, "receiveTime", "Lcom/displayaudio/DateInfo;");

        //DateInfo provideTime
        jfieldID jfprovideTime = env->GetFieldID(jcDhd, "provideTime", "Lcom/displayaudio/DateInfo;");

        //int serviceType
        jfieldID jfserviceType = env->GetFieldID(jcDhd, "serviceType", "I");

        //PositionInfo receivePosition
        jfieldID jfreceivePosition = env->GetFieldID(jcDhd, "receivePosition", "Lcom/displayaudio/PositionInfo;");

        //int RoadNo
        jfieldID jfRoadNo = env->GetFieldID(jcDhd, "roadNo", "I");

        //int provideServiceNo
        jfieldID jfprovideServiceNo = env->GetFieldID(jcDhd, "provideServiceNo", "I");

        //PositionInfo noticePosition
        jfieldID jfnoticePosition = env->GetFieldID(jcDhd, "noticePosition", "Lcom/displayaudio/PositionInfo;");

        //PositionInfo serviceoutPosition
        jfieldID jfserviceoutPosition = env->GetFieldID(jcDhd, "serviceoutPosition", "Lcom/displayaudio/PositionInfo;");

        //int judgmentResult
        jfieldID jfjudgmentResult = env->GetFieldID(jcDhd, "judgmentResult", "I");

        //新建object
        jobject joDhd = env->AllocObject(jcDhd);

        //给每一个实例的变量付值
        for(int i=0; i < _HISTORY_DATA_MAX; i++ )
        {
        env->SetObjectField(joDhd, jfreceiveTime, joDdi);
        env->SetObjectField(joDhd, jfprovideTime, joDdi);
        env->SetObjectField(joDhd, jfreceivePosition, joDpi);

        env->SetObjectField(joDhd, jfnoticePosition, joDpi);
        env->SetObjectField(joDhd, jfserviceoutPosition, joDpi);
        env->SetIntField(joDhd, jfserviceType, dhif.History[i].serviceType);
        env->SetIntField(joDhd, jfRoadNo, dhif.History[i].RoadNo);
        env->SetIntField(joDhd, jfprovideServiceNo, dhif.History[i].provideServiceNo);
        env->SetIntField(joDhd, jfjudgmentResult, dhif.History[i].judgmentResult);
        }

        /*************
        * HistoryInfo*
        **************/
        //获取Java中的实例类
        jclass jcDhi = env->FindClass("com/displayaudio/HistoryInfo");

        //int History_num
        jfieldID jfHistory_num = env->GetFieldID(jcDhi, "History_num", "I");

        //HistoryData History[]
        jfieldID jfHistoryData = env->GetFieldID(jcDhi, "History", "[Lcom/displayaudio/HistoryData;");

        //新建object
        jobject joDhi = env->AllocObject(jcDhi);

        //给每一个实例的变量付值
        env->SetIntField(joDhi,jfHistory_num,dhif.History_num);

        //这里创建一个java的HistoryInfo类中的数组,容量为100,第一个数据为joDhd
        jobjectArray joRecArr = env->NewObjectArray(100,jcDhd,joDhd);

        //把这个数组赋值到java的HistoryInfo对象的HistoryData属性上
        env->SetObjectField(joDhi, jfHistoryData, joRecArr);

        return joDhi;
}
lxzj1118 2014-04-25
  • 打赏
  • 举报
回复
哈哈 不好意思啊,没考虑看的人的感受。 主要对引用不太熟悉,这回懂了。 辛苦帮忙再看下 1.类定义如下:
public class PositionInfo {
        public int latitudes_degree;
        public int latitudes_min;
        public int latitudes_sec;
        public int longitude_degree ;
        public int longitude_min;
        public int longitude_sec;
}

public class DateInfo {
        public int year;
        public int month;
        public int day;
        public int hour;
        public int min;
        public int sec;
}


public class HistoryData {
        public DateInfo receiveTime;           
        public DateInfo provideTime;                                        
        public int serviceType;                        
        public PositionInfo receivePosition;
        public int roadNo;
        public int provideServiceNo;   
        public PositionInfo noticePosition;
        public PositionInfo serviceoutPosition;                
        public int judgmentResult;
}

public class HistoryInfo{
        public int History_num;                            
        public HistoryData[] History;  
}

2.//Service.java
public class Service extends IService.Stub {
static {
            System.loadLibrary("Controller");
    }
  
    public native HistoryInfo get_HistoryData();
}

suciver 2014-04-25
  • 打赏
  • 举报
回复
楼主你这样贴代码不整成代码格式的,我怎么看,我眼睛都看花了。楼主参考上面的,自己检查检查吧。
suciver 2014-04-24
  • 打赏
  • 举报
回复
一样的,只是数组的时候你的结构体MyInfo的rec也改成结构体就是了。jfieldID jfrec = env->GetFieldID(jcInfo, "rec", "[Lcom/jinhill/util/Record;");得到这个rec属性的签名变成Record数组的签名就是了,其它的在用mi.rec加上数组的下标,此时用jobjectArray joRecArr = env->NewObjectArray(10,jcRec,joRec); env->SetObjectField(joInfo, jfrec, joRecArr);NativeModule.h头文件你直接用javah生成即可 这里是NativeModule头文件内容

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeModule */

#ifndef _Included_NativeModule
#define _Included_NativeModule
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     NativeModule
 * Method:    getInfo
 * Signature: ()LMyInfo;
 */
JNIEXPORT jobject JNICALL Java_NativeModule_getInfo
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
java代码MyInfo中的Record rec变成Record rec[];以下是C中的JNI具体的代码

#include <stdio.h>
#include <windows.h>
#include "NativeModule.h"

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[10];//这里也用数组
}MyInfo;

JNIEXPORT jobject JNICALL Java_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[0].id = 2011;//所有rec操作的地方加上下标
    memcpy(mi.rec[0].data, "\x01\x02\x03\x04\x05\x06", 6);
    strcpy(mi.rec[0].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("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[0].id);

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

    jbyteArray jbarr = env->NewByteArray(6);  
    jbyte *jb = env->GetByteArrayElements(jbarr, 0); 
    memcpy(jb, mi.rec[0].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);
	
    //这里创建一个java的MyInfo类中的Record数组,容量为10,第一个数据为joRec
    jobjectArray joRecArr = env->NewObjectArray(10,jcRec,joRec);
    //把这个数组赋值到java的MyInfo对象的rec属性上
    env->SetObjectField(joInfo, jfrec, joRecArr);

    return joInfo;		
}

lxzj1118 2014-04-24
  • 打赏
  • 举报
回复
哪位高手给回复一下吧?

50,554

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧