JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
本文原创,转载请注明出处:http://blog.csdn.net/qinjuning
在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态
链接库 (windos下就是.dll库,Linux就是.so库了,不懂在Window下生成dll动态库的,具体流程可看我的这篇博客:
《Android中JNI的使用之一:Java原生JNI的使用、javah指令的使用以及图解教材》)。即可掌握JNI的使用了了。
总的来说,JNI是不难的。通过前面的学习相信你应该有所了解。今天,我们从几个简单的小例子,来对JNI进行下实战训练。
可都是些小例子,耐心看咯。
主要操作内容,包括如下几个部分:
1、在Native层返回一个字符串
2、从Native层返回一个int型二维数组(int a[ ][ ])
3、从Native层操作Java层的类: 读取/设置类属性
4、在Native层操作Java层的类:读取/设置类属性、回调Java方法
5、从Native层返回一个复杂对象(即一个类咯)
6、在Java层传递复杂对象至Native层
7、从Native层返回Arraylist集合对象
广而告知,这些操作就是简单的利用一些JNI函数即实现了。so easy 。
一、在Native层返回一个字符串
Java层原型方法:
public class HelloJni { ... public native void getAJNIString(); ... }
Native层该方法实现为 :
/* * Class: com_feixun_jni_HelloJni * Method: getAJNIString * Signature: ()Ljava/lang/String; */ //返回字符串 JNIEXPORT jstring JNICALL Java_com_feixun_jni_HelloJni_getAJNIString(JNIEnv * env, jobject obj) { jstring str = env->newStringUTF("HelloJNI"); //直接使用该JNI构造一个jstring对象返回 return str ; }
二、在Native层返回一个int型二维数组(inta[ ][ ])
Java层原型方法:
public class HelloJni { ... //参数代表几行几列数组 ,形式如:int a[dimon][dimon] private native int[][] getTwoArray(int dimon) ; ... }
Native层该方法实现为 :
/* * Class: com_feixun_jni_HelloJni * Method: getTwoArray * Signature: (I)[[I */ //通过构造一个数组的数组, 返回 一个二维数组的形式 JNIEXPORT jobjectArray JNICALL Java_com_feixun_jni_HelloJni_getTwoArray (JNIEnv * env, jobject object, jint dimion) { jclass intArrayClass = env->FindClass("[I"); //获得一维数组 的类引用,即jintArray类型 //构造一个指向jintArray类一维数组的对象数组,该对象数组初始大小为dimion jobjectArray obejctIntArray = env->NewObjectArray(dimion ,intArrayClass , NULL); //构建dimion个一维数组,并且将其引用赋值给obejctIntArray对象数组 for( int i = 0 ; i< dimion ; i++ ) { //构建jint型一维数组 jintArray intArray = env->NewIntArray(dimion); jint temp[10] ; //初始化一个容器,假设 dimion < 10 ; for( int j = 0 ; j < dimion ; j++) { temp[j] = i + j ; //赋值 } //设置jit型一维数组的值 env->SetIntArrayRegion(intArray, 0 , dimion ,temp); //给object对象数组赋值,即保持对jint一维数组的引用 env->SetObjectArrayElement(obejctIntArray , i ,intArray); env->DeleteLocalRef(intArray); //删除局部引用 } return obejctIntArray; //返回该对象数组 }