欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

JNI由淺入深_6_簡單對象的應(yīng)用 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

JNI由淺入深_6_簡單對象的應(yīng)用

發(fā)表時(shí)間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):35

1、聲明native辦法


public class ComplexObject {

	/**
	 * 返回一個(gè)對象數(shù)組
	 * @param val
	 * @return
	 */
	public native Person[] receiverBeanArray(String val);

	/**
	 * 獲取對象
	 * @return
	 */
	public native Person getPerson();

	/**
	 * 獲取對象的集合
	 * @return
	 */
	public native ArrayList<Person> getPersonList();

}

2、Person類對象

有兩個(gè)構(gòu)造函數(shù),主如果為了在jni中經(jīng)由過程不合的構(gòu)造函數(shù)來創(chuàng)建Person對象。


public class Person {

	public String name;
	private int age;

	public Person() {
		super();
	}

	public Person(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}

3、jni操作實(shí)現(xiàn)


JNI中,構(gòu)造函數(shù)可以和實(shí)例辦法一樣被調(diào)用,調(diào)用方法也相似。傳入“<init>”作為辦法名,“V”作為返回類型。你可以經(jīng)由過程向JNI函數(shù)NewObject傳入辦法來調(diào)用構(gòu)造函數(shù)。


/**
 * 拼接字符串
 */
char* strJoin(char *s1, char *s2) {
	char *result = malloc(strlen(s1) + strlen(s2) + 1);
	if (result == NULL)
		exit(1);
	strcpy(result, s1);
	strcat(result, s2);
	return result;
}
/**
 * 返回一個(gè)數(shù)組類型到Java
 */
JNIEXPORT jobjectArray JNICALL Java_com_example_jniandroid_service_ComplexObject_receiverBeanArray
  (JNIEnv * env, jobject obj , jstring string) {
	jclass objClass = (*env)->FindClass(env, "java/lang/Object");
	jobjectArray mails = (*env)->NewObjectArray(env, (jsize) ARRAY_LENGTH,objClass, 0);
	jclass personClass = (*env)->FindClass(env,"com/example/jniandroid/bean/Person");

	jfieldID field_name = (*env)->GetFieldID(env, personClass, "name","Ljava/lang/String;");
	jmethodID construction_id = (*env)->GetMethodID(env, personClass, "<init>","()V");
	jfieldID field_age = (*env)->GetFieldID(env,personClass, "age", "I");
	jclass mPerson = (*env)->NewObject(env, personClass, construction_id);

	int i = 0;
	//將jstring類型轉(zhuǎn)成char*
	char* nameStr = (char*)(*env)->GetStringUTFChars(env,string, 0);
	//拼接字符串
	const char* name = strJoin(nameStr,"-join jni");
	LOGD("數(shù)組總和 =%s", name);
	for (; i < ARRAY_LENGTH; i++) {
		int age = 20+i;
		//將Java的字符串和c的字符串進(jìn)行拼接后賦值給name屬性
		(*env)->SetObjectField(env, mPerson, field_name, (*env)->NewStringUTF(env,name));
		(*env)->SetIntField(env,mPerson, field_age,age);
		(*env)->SetObjectArrayElement(env, mails, (jsize)i, mPerson);
	}
	return mails;
}


/**
 * 在jni中給Java對象設(shè)置值并返回
 */
JNIEXPORT jobject JNICALL Java_com_example_jniandroid_service_ComplexObject_getPerson
  (JNIEnv * env, jclass obj) {
	//找到Person類
	jclass m_cls = (*env)->FindClass(env,"com/example/jniandroid/bean/Person");
	//無參數(shù)的構(gòu)造辦法
	jmethodID m_mid = (*env)->GetMethodID(env,m_cls, "<init>", "()V");
	//獲取Java中復(fù)雜類型以L開端;結(jié)尾,中心昵嚕型將.改成/
	jfieldID m_fid_name = (*env)->GetFieldID(env,m_cls, "name", "Ljava/lang/String;");
	//根本類型,I表示Java中的int
	jfieldID m_fid_age = (*env)->GetFieldID(env,m_cls, "age", "I");

	if(m_fid_name==NULL){
		printf("m_fid_name is null ");
		return;
	}
	if(m_fid_age==NULL){
		printf("m_fid_age is null ");
		return;
	}

	jobject m_obj = (*env)->NewObject(env,m_cls, m_mid);

	(*env)->SetObjectField(env,m_obj, m_fid_name, (*env)->NewStringUTF(env,"Set the name Person object in the JNI value"));
	(*env)->SetIntField(env,m_obj, m_fid_age,96);

	return m_obj;
}

/**
 * 返回ArrayList集合
 */
JNIEXPORT jobject JNICALL Java_com_example_jniandroid_service_ComplexObject_getPersonList(
		JNIEnv * env, jobject obj) {
	jclass list_cls = (*env)->FindClass(env, "java/util/ArrayList"); //獲得ArrayList類引用

	jmethodID list_costruct = (*env)->GetMethodID(env, list_cls, "<init>","()V"); //獲得得構(gòu)造函數(shù)Id
	jobject list_obj = (*env)->NewObject(env, list_cls, list_costruct); //創(chuàng)建一個(gè)Arraylist集合對象
	//Arraylist類中的 add()辦法ID,其辦法原型為: boolean add(Object object) ,boolean類型對應(yīng)的是Z;
	jmethodID list_add = (*env)->GetMethodID(env, list_cls, "add","(Ljava/lang/Object;)Z");

	jclass personClass = (*env)->FindClass(env,"com/example/jniandroid/bean/Person"); //獲得Person類引用
	//獲得該類型的構(gòu)造函數(shù)  函數(shù)名為 <init> 返回類型必須為 void 即 V
	jmethodID person_costruct = (*env)->GetMethodID(env, personClass, "<init>","(ILjava/lang/String;)V");
	int i=0;
	for (; i < 5; i++) {
		jstring str = (*env)->NewStringUTF(env, "jni Native");
		//經(jīng)由過程調(diào)用該對象的構(gòu)造函數(shù)來new 一個(gè) Student實(shí)例
		jobject person_obj = (*env)->NewObject(env, personClass,person_costruct, i, str); //結(jié)垢荷瑣對象
		//履行Arraylist類實(shí)例的add辦法,添加一個(gè)Person對象
		(*env)->CallBooleanMethod(env,list_obj, list_add, person_obj);
	}
	return list_obj;
}

相關(guān)案例查看更多