ndk

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 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 , "","()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类引用  
    //获得该类型的构造函数  函数名为  返回类型必须为 void 即 V  
    jmethodID stu_costruct = env->GetMethodID(stu_cls , "", "(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 ;  
}  

参考资料

  • JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

你可能感兴趣的:(ndk)