ndk

JNI介紹

1.在java和c之間進(jìn)行數(shù)據(jù)傳遞

對(duì)于基本數(shù)據(jù)類(lèi)型,java和c是相互對(duì)應(yīng)的,所以可以直接使用。它們的對(duì)應(yīng)關(guān)系為;
Java類(lèi)型   本地類(lèi)型   字節(jié)(bit)
boolean   jboolean   8, unsigned
byte    jbyte     8
char    jchar    16, unsigned
short    jshort    16
int     jint     32
long    jlong    64
float    jfloat    32
double   jdouble   64
void    void     n/a

七、最后加個(gè)難度,即在Native層返回集合對(duì)象(留這兒,以后也好找點(diǎn))

Java層的對(duì)應(yīng)方法為:

public class HelloJni {  
    ...  
    //在Native層返回ArrayList集合   
    public native ArrayList<Student> native_getListStudents();  
    ...   
}     

Native層該方法實(shí)現(xiàn)為 :

/* 
 * Class:     com_feixun_jni_HelloJni 
 * Method:    native_getListStudents 
 * Signature: ()Ljava/util/ArrayList; 
 */ //獲得集合類(lèi)型的數(shù)組  
JNIEXPORT jobject JNICALL Java_com_feixun_jni_HelloJni_native_getListStudents  
  //env是一個(gè)線(xiàn)程相關(guān)的結(jié)構(gòu)體, 該結(jié)構(gòu)體代表了 [Java]在本線(xiàn)程的運(yùn)行環(huán)境
  //obj代表執(zhí)行此JNI操作的類(lèi)實(shí)例引用  
  (JNIEnv * env, jobject obj)  
{  
    //操作的是java類(lèi)
    jclass list_cls = env->FindClass("Ljava/util/ArrayList;");//獲得ArrayList類(lèi)引用  
  
    if(listcls == NULL)  
    {  
        cout << "listcls is null \n" ;  
    }  
    jmethodID list_costruct = env->GetMethodID(list_cls , "<init>","()V"); //獲得得構(gòu)造函數(shù)Id  
  
    jobject list_obj = env->NewObject(list_cls , list_costruct); //創(chuàng)建一個(gè)Arraylist集合對(duì)象  
    //或得Arraylist類(lèi)中的 add()方法ID,其方法原型為: boolean add(Object object) ;  
    jmethodID list_add  = env->GetMethodID(list_cls,"add","(Ljava/lang/Object;)Z");   
    
    jclass stu_cls = env->FindClass("Lcom/feixun/jni/Student;");//獲得Student類(lèi)引用  
    //獲得該類(lèi)型的構(gòu)造函數(shù)  函數(shù)名為 <init> 返回類(lèi)型必須為 void 即 V  
    jmethodID stu_costruct = env->GetMethodID(stu_cls , "<init>", "(ILjava/lang/String;)V");  
  
    for(int i = 0 ; i < 3 ; i++)  
    {  
        jstring str = env->NewStringUTF("Native");  
        //通過(guò)調(diào)用該對(duì)象的構(gòu)造函數(shù)來(lái)new 一個(gè) Student實(shí)例  
        jobject stu_obj = env->NewObject(stucls , stu_costruct , 10,str);  //構(gòu)造一個(gè)對(duì)象  
          
        env->CallBooleanMethod(list_obj , list_add , stu_obj); //執(zhí)行Arraylist類(lèi)實(shí)例的add方法,添加一個(gè)stu對(duì)象  
    }  
  
    return list_obj ;  
}  

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容