本帖最后由 yiyaaixuexi 于 2012-01-05 22:28:49 编辑

解决方案 »

  1.   

    把DiskInfo 单独写个类,别写成内部类看看
      

  2.   

    我觉得应该这样写:public class DiskInfo {   
          //名字   
          public String name;   
        
          //序列号   
          public int serial;       //定义构造函数
          DiskInfo(String name, int serial)
          {
            this.name = name;
            this.seral = serial;
          }  
    }-----------------------JNIEXPORT jobject JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStruct   
    (JNIEnv *env, jobject obj)  
    {//获取Java中的实例类 
    jclass objectClass = (*env)-> FindClass(env,"com/sundy/jnidemo/ChangeMethodFromJni$DiskInfo");  //获取Java中的构造函数
    jmethodID init = (*env)->GetMethodID(env, objectClass , "<init>", "(Ljava/lang/String;I)V");//调用构造函数创建对象,写入名字和序列号
    jobject obj = (*env)->NewObject(env, objectClass, init, (*env)->NewStringUTF(env, "my name is D:"), 10);//返回创建的对象
    return obj;
    }
      
      

  3.   

    上个帖子的变量命名有些问题,现在重新写一下。 
    public class DiskInfo 
    {   
      //名字   
      public String name;   
        
      //序列号   
      public int serial;    //定义构造函数
      DiskInfo(String name, int serial)
      {
         this.name = name;
         this.serial = serial;
      }   
    }
    JNIEXPORT jobject JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStruct   
    (JNIEnv *env, jobject obj)   
    {//获取Java中的实例类  
    jclass objectClass = (*env)-> FindClass(env,"com/sundy/jnidemo/ChangeMethodFromJni$DiskInfo");   //获取Java中的构造函数
    jmethodID init = (*env)->GetMethodID(env, objectClass , "<init>", "(Ljava/lang/String;I)V");//调用构造函数创建对象,写入名字和序列号
    jobject newObj = (*env)->NewObject(env, objectClass, init, (*env)->NewStringUTF(env, "my name is D:"), 10);//返回创建的对象
    return newObj;
    }
      

  4.   

    我觉得出错的地方在SetObjectField因为Java_com_sundy_jnidemo_ChangeMethodFromJni_getStruct (JNIEnv *env, jobject obj)  
    中的第二个参数obj并不是你的DiskInfo对象,所以
    SetObjectField(env, obj, ... )、SetShortField(env, obj, ...) 找不到相应的数据成员,所以出错。除非你在java层把DiskInfo对象传下来,例如:
    Java_com_sundy_jnidemo_ChangeMethodFromJni_getStruct (JNIEnv *env, jobject obj, jobject diskInfoObj)
    这样 SetObjectField(env, diskInfoObj, ... )、SetShortField(env, diskInfoObj, ...) 就不会出错了。
      

  5.   

    http://topic.csdn.net/u/20120106/14/09277aad-ef19-406c-8c1f-dfb185ee5cf0.html
    麻烦再去解决下这个问题