关于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麻烦再去解决下这个问题 求Android之3G视频 安卓读excel中文读不了的问题 SDK_r15和SDK_r10在project中的一些区别 android守护进程installd分析 过年好,请问安卓下使用usb的数字键盘的问题 左看右看也没有问题,但是总报错 请教!我在建立一个android时,出现如下错误,请问该怎么解决 如何向xml文件中添加节点 onPrepareOptionsMenu 调用一个弹出窗 手机用户之间的文件共享 关于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, ...) 就不会出错了。
麻烦再去解决下这个问题