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);
}