牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2012-05-27 投稿人: 浏览次数:205

 

                                                                                       本文原创,转载请注明出处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; //返回该对象数组
}


 三、在Native层操作Java层的类 :读取/设置类属性


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。