首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

jni返回数组参数,该如何处理

2012-05-05 
jni返回数组参数上代码java类public class SongInfo {public int nSongId 0public int nSongSignId 0

jni返回数组参数
上代码
java类
public class SongInfo {
public int nSongId = 0;
public int nSongSignId = 0;
public int nVersionsId = 0;
public int nIsNew = 0;
public int nIsHot = 0;
public int nSelected = 0;
public String strSongName = "";
public String strSingerName = "";
public String strLanguageType = "";
}

public native static Object TestParameter(Object parameter);

C++
JNIEXPORT jobject JNICALL Java_com_jni_HelloJni_TestParameter
(JNIEnv *env, jclass, jobject obj){
//解析传入的对象
//首先我们要取得arrayList对象
jclass cls_arraylist = env->GetObjectClass(obj);
//获得arraylist 的get方法的id
jmethodID arraylist_get = env->GetMethodID(cls_arraylist,"get","(I)Ljava/lang/Object;"); 
//获得方法ID,size 方法返回arrrylist中的元素个数
jmethodID arraylist_size = env->GetMethodID(cls_arraylist,"size","()I");
//调用方法获得arrlist的元素个数
jsize len = env->CallIntMethod(obj, arraylist_size);
jclass clazz =env->FindClass("com/jni/SingerInfo"); 
jfieldID j = env->GetFieldID(clazz, "nSingerId", "I");
jfieldID t = env->GetFieldID(clazz, "strSingerName", "Ljava/lang/String;"); 

for (int i = 0; i < len; i++) {
jobject jObj = (jstring)env->CallObjectMethod(obj, arraylist_get,i);
int age = env->GetIntField(jObj, j); 
printf("%d",age);

jstring jstr2 = (jstring) env->GetObjectField(jObj, t);
const char *str = env->GetStringUTFChars(jstr2, 0); 
printf("%s",str);
}

  //返回数组
jobjectArray songs = env->NewObjectArray(3,clazz,0);
jmethodID construction_id = env->GetMethodID(clazz, "<init>", "()V");
for (int k=0 ;k<3 ;k++)
{

jobject myObj = env->NewObject(clazz, construction_id);
env->SetObjectField(myObj,j,(jobject)2000 );
env->SetObjectArrayElement(songs,k,myObj);

}

return songs;

};


上半段我传了一个ArrayList<SingerInfo> singerInfos = new ArrayList<>();进去
SingerInfo[] ss = (SingerInfo[]) TestParameter(singerInfos);可以正常显示内容
但是我要返回同类型的数组时出错,请大家帮我改一下。谢谢!


[解决办法]
参数方法错了
for (int k=0 ;k<3 ;k++)
{

jobject myObj = env->NewObject(clazz, construction_id);
jint a = 200 + k;
env->SetIntField(myObj,j,a );
char ch[] = "libai";
jstring s1=env->NewStringUTF(ch);
env->SetObjectField(myObj,t,(jobject)s1 );
env->SetObjectArrayElement(songs,k,myObj);

}

热点排行