JNI開發-Java從C/C++獲取List集合物件
阿新 • • 發佈:2019-02-13
JNI開發有時需要Java從C/C++獲取List物件,此篇主要講解Java從C/C++獲取List<Student>返回值;
1. 定義com.niubashaoye.simple.jni.StuInfo類
public class StuInfo { private int stuId; private String stuName; private int stuAge; private String className; public StuInfo(int stuId, String stuName, int stuAge, String className) { super(); this.stuId = stuId; this.stuName = stuName; this.stuAge = stuAge; this.className = className; } //getter() //setter() @Override public String toString() { return "StuInfo [stuId=" + stuId + ", stuName=" + stuName + ", stuAge=" + stuAge + ", className=" + className + "]"; } }
2. 新增native函式
public class JNITools {
static {
System.loadLibrary("TestDemo");
}
/**
* 從C獲取list
*
* @return
*/
public native List<StuInfo> getStuList();
}
* 從C獲取list
*
* @return
*/
public native List<StuInfo> getStuList();
}
3. C/C++檔案
3.1 新增StuInfo結構體
typedef struct { int stuId; char stuName[50]; int stuAge; char className[50]; } StuInfo;
3.2 獲取List<StuInfo>物件
JNIEXPORT jobject JNICALL Java_com_niubashaoye_simple_jni_JNITools_getStuList( JNIEnv *env, jobject obj) { //獲取ArrayList類引用 jclass list_jcs = env->FindClass("java/util/ArrayList"); if (list_jcs == NULL) { LOGI("ArrayList no find!"); return NULL; } //獲取ArrayList建構函式id jmethodID list_init = env->GetMethodID(list_jcs, "<init>", "()V"); //建立一個ArrayList物件 jobject list_obj = env->NewObject(list_jcs, list_init, ""); //獲取ArrayList物件的add()的methodID jmethodID list_add = env->GetMethodID(list_jcs, "add", "(Ljava/lang/Object;)Z"); //獲取StuInfo類 jclass stu_cls = env->FindClass("com/niubashaoye/simple/jni/StuInfo"); //獲取StuInfo的建構函式 jmethodID stu_init = env->GetMethodID(stu_cls, "<init>", "(ILjava/lang/String;ILjava/lang/String;)V"); StuInfo stuInfo; stuInfo.stuId = 100001; stuInfo.stuAge = 20; const char *name = "牛八少爺"; strcpy(stuInfo.stuName, name); const char *className = "高三六班"; strcpy(stuInfo.className, className); for (int i = 0; i < 4; i++) { LOGI("第%d個學生資訊:id=%d,name=%s,age=%d,className=%s", i + 1, (stuInfo.stuId + i), stuInfo.stuName, (stuInfo.stuAge + i), stuInfo.className); //通過StuInfo的建構函式建立StuInfo物件 jobject stu_obj = env->NewObject(stu_cls, stu_init, (stuInfo.stuId + i), env->NewStringUTF(stuInfo.stuName), (stuInfo.stuAge + i * 5), env->NewStringUTF(stuInfo.className)); env->CallBooleanMethod(list_obj, list_add, stu_obj); } return list_obj; }
JNIEnv *env, jobject obj) { //獲取ArrayList類引用 jclass list_jcs = env->FindClass("java/util/ArrayList"); if (list_jcs == NULL) { LOGI("ArrayList no find!"); return NULL; } //獲取ArrayList建構函式id jmethodID list_init = env->GetMethodID(list_jcs, "<init>", "()V"); //建立一個ArrayList物件 jobject list_obj = env->NewObject(list_jcs, list_init, ""); //獲取ArrayList物件的add()的methodID jmethodID list_add = env->GetMethodID(list_jcs, "add", "(Ljava/lang/Object;)Z"); //獲取StuInfo類 jclass stu_cls = env->FindClass("com/niubashaoye/simple/jni/StuInfo"); //獲取StuInfo的建構函式 jmethodID stu_init = env->GetMethodID(stu_cls, "<init>", "(ILjava/lang/String;ILjava/lang/String;)V"); StuInfo stuInfo; stuInfo.stuId = 100001; stuInfo.stuAge = 20; const char *name = "牛八少爺"; strcpy(stuInfo.stuName, name); const char *className = "高三六班"; strcpy(stuInfo.className, className); for (int i = 0; i < 4; i++) { LOGI("第%d個學生資訊:id=%d,name=%s,age=%d,className=%s", i + 1, (stuInfo.stuId + i), stuInfo.stuName, (stuInfo.stuAge + i), stuInfo.className); //通過StuInfo的建構函式建立StuInfo物件 jobject stu_obj = env->NewObject(stu_cls, stu_init, (stuInfo.stuId + i), env->NewStringUTF(stuInfo.stuName), (stuInfo.stuAge + i * 5), env->NewStringUTF(stuInfo.className)); env->CallBooleanMethod(list_obj, list_add, stu_obj); } return list_obj; }
4. Java呼叫native函式
List<StuInfo> stuList = jniTools.getStuList();
Toast.makeText(getApplicationContext(), stuList.toString(), Toast.LENGTH_SHORT).show();
List<StuInfo> stuList = jniTools.getStuList();
Toast.makeText(getApplicationContext(), stuList.toString(), Toast.LENGTH_SHORT).show();