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 ;
}