1. 程式人生 > >JNI開發-Java從C/C++獲取List集合物件

JNI開發-Java從C/C++獲取List集合物件

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