相信在使用jni的過程中,總是要傳遞各種各樣的類型,在這其中,我也碰到了一些問題。
簡單的傳一些內容,相信在網上一搜一大把。
所以我們就來說說。傳遞對象中包含arraylist吧。
在這里先給大家一個連接,顯示一些jni的傳遞:http://blog.csdn.NET/u_xtian/article/details/6033963
所以,我們定義一些Java中的類
user.java
public class User{
private long id;
private boolean isMan;
}
name.java
public class People{
private int id;
private ArrayList<User> myuser;
}
public class Hello{
static{
System.loadLibrary("user");
}
public native void SetUser(People people);
}
在C語言中:
#include<jni.h>
JNIEXPORT void JNICALL Java_Hello_SetUser(JNIEnv*, jobject jthiz, jobject people);
JNIEXPORT void JNICALL Java_HelloJni_setUserList (JNIEnv *env, jobject jthiz, jobject people){
jclass peo_cls = env->GetObjectClass(people);
if(peo_cls == NULL)
{
return ;
}
jfieldID idFieldID = env->GetFieldID(peo_cls,"id","I"); //獲得得People類的屬性id
jint id= env->GetIntField(people, idFieldID ); //獲得屬性值
jfieldID codeFieldID = env->GetFieldID(peo_cls,"myuser","Ljava/util/ArrayList;");
jobject codeobj = env->GetObjectField(people, codeFieldID);
if(codeobj == NULL)
{
return ;
}
int i;
jclass cls_arraylist = env->GetObjectClass(codeobj);
//method in class ArrayList
jmethodID arraylist_get = env->GetMethodID(cls_arraylist,"get","(I)Ljava/lang/Object;");
jmethodID arraylist_size = env->GetMethodID(cls_arraylist,"size","()I");
jint len = env->CallIntMethod(codeobj,arraylist_size);
for(i=0;i<len;i++){
jobject obj_user = env->CallObjectMethod(codeobj,arraylist_get,i);
jclass cls_user = env->GetObjectClass(obj_user);
jfieldID idFieldID = env->GetFieldID(cls_user,"id","J"); // 獲得屬性ID
jfieldID isManFieldID = env->GetFieldID(cls_user,"isMan","Z"); // 獲得屬性ID
jint id= env->GetIntField(obj_user , idFieldID );//獲得屬性值
jboolean isMan= env->GetBooleanField(obj_user ,isManFieldID );//獲得屬性值
}
這樣就完成了。在對象object中包含有arraylist的對象。
