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