知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?
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)案例查看更多
相關(guān)閱讀
- 小程序開發(fā)聯(lián)系方式
- 小程序分銷商城
- 汽車報(bào)廢回收管理軟件
- 云南企業(yè)網(wǎng)站
- 小程序開發(fā)課程
- 保山小程序開發(fā)
- 網(wǎng)站開發(fā)公司哪家好
- 河南小程序制作
- 網(wǎng)絡(luò)公司哪家好
- 網(wǎng)站建設(shè)費(fèi)用
- 網(wǎng)站建設(shè)專業(yè)品牌
- 生成海報(bào)
- 報(bào)廢車回收
- 云南網(wǎng)站建設(shè)優(yōu)化
- typescript
- 網(wǎng)站建設(shè)高手
- 云南網(wǎng)站維護(hù)
- asp網(wǎng)站
- 云南網(wǎng)站開發(fā)
- 云南建站公司
- 智慧農(nóng)貿(mào)市場
- .net網(wǎng)站
- 云南建設(shè)廳官方網(wǎng)站
- 小程序開發(fā)排名前十名
- 網(wǎng)站制作哪家好
- 搜索引擎自然排名
- 汽車拆解管理軟件
- 報(bào)廢車管理
- 服務(wù)器
- 云南電商網(wǎng)站建設(shè)