ndk

作者: jacky123 | 来源:发表于2016-07-04 12:01 被阅读22次

    JNI介绍

    1.在java和c之间进行数据传递

    对于基本数据类型,java和c是相互对应的,所以可以直接使用。它们的对应关系为;
    Java类型   本地类型   字节(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

    七、最后加个难度,即在Native层返回集合对象(留这儿,以后也好找点)

    Java层的对应方法为:

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

    Native层该方法实现为 :

    /* 
     * Class:     com_feixun_jni_HelloJni 
     * Method:    native_getListStudents 
     * Signature: ()Ljava/util/ArrayList; 
     */ //获得集合类型的数组  
    JNIEXPORT jobject JNICALL Java_com_feixun_jni_HelloJni_native_getListStudents  
      //env是一个线程相关的结构体, 该结构体代表了 [Java]在本线程的运行环境
      //obj代表执行此JNI操作的类实例引用  
      (JNIEnv * env, jobject obj)  
    {  
        //操作的是java类
        jclass list_cls = env->FindClass("Ljava/util/ArrayList;");//获得ArrayList类引用  
      
        if(listcls == NULL)  
        {  
            cout << "listcls is null \n" ;  
        }  
        jmethodID list_costruct = env->GetMethodID(list_cls , "<init>","()V"); //获得得构造函数Id  
      
        jobject list_obj = env->NewObject(list_cls , list_costruct); //创建一个Arraylist集合对象  
        //或得Arraylist类中的 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类引用  
        //获得该类型的构造函数  函数名为 <init> 返回类型必须为 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");  
            //通过调用该对象的构造函数来new 一个 Student实例  
            jobject stu_obj = env->NewObject(stucls , stu_costruct , 10,str);  //构造一个对象  
              
            env->CallBooleanMethod(list_obj , list_add , stu_obj); //执行Arraylist类实例的add方法,添加一个stu对象  
        }  
      
        return list_obj ;  
    }  
    

    参考资料

    相关文章

      网友评论

          本文标题:ndk

          本文链接:https://www.haomeiwen.com/subject/lsicjttx.html