关于JNI调用返回结构体的问题!请教一下! 本帖最后由 yiyaaixuexi 于 2012-01-05 22:28:49 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把DiskInfo 单独写个类,别写成内部类看看 我觉得应该这样写: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;} 上个帖子的变量命名有些问题,现在重新写一下。 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;} 我觉得出错的地方在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, ...) 就不会出错了。 http://topic.csdn.net/u/20120106/14/09277aad-ef19-406c-8c1f-dfb185ee5cf0.html麻烦再去解决下这个问题 图片过大,如何使bitmap自适应填充我画的矩形? RelativeLayout布局的一些尴尬 关于读取Android虚拟机多媒体文件的问题? 知道了包名,能否得到包里面所有的activity 关于ListView更新问题 全屏的时候,软键盘上弹,界面往上移,如何解决这问题 android sdk 菜鸟的取经一小步 Android4.4以前版本dex拆分 AppBarLayout中使用fitsSystemWindows无效 关于JNI调用返回结构体数组的问题!请教一下! Android2.2SDK下ViewStub很简单的应用为什么都会出异常??麻烦大家帮个忙
//名字
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;
}
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;
}
中的第二个参数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, ...) 就不会出错了。
麻烦再去解决下这个问题