jni处理java数组_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > jni处理java数组

jni处理java数组

 2015/5/2 19:07:51  hm4123660  程序员俱乐部  我要评论(0)
  • 摘要:使用jni来操作java中的数组对象。java数组分为基本类型数组和对象数组。在jni中可以使用GetArrayLength(jarrayarray)来获取这两组数组的长度。jni提供两个重要函数来处理java数组(1)Get<Type>ArrayElements(<Type>Arrayarr,jboolean*isCopide);这类函数可以把Java基本类型的数组转换到C/C++中的数组,有两种处理方式,一种是拷贝一份传回本地代码
  • 标签:数组 Java

??????????????使用jni来操作java中的数组对象。java数组分为基本类型数组和对象数组。在jni中可以使用GetArrayLength(jarray array)来获取这两组数组的长度。

?

jni提供两个重要函数来处理java数组

(1) Get<Type>ArrayElements(<Type>Array arr , jboolean* isCopide);

这 类函数可以把Java基本类型的数组转换到C/C++中的数组,有两种处理方式,一种是拷贝一份传回本地代码,另一个是把指向Java数组的指针直接传 回到本地代码中,处理完本地化的数组后,通过Release<Type>ArrayElements来释放数组

?

(2) Release<Type>ArrayElements(<Type>Array arr , <Type>* array , jint mode)

用这个函数可以选择将如何处理Java跟C++的数组,是提交,还是撤销等,内存释放还是不释放等

mode可以取下面的值:

0 :对Java的数组进行更新并释放C/C++的数组

JNI_COMMIT :对Java的数组进行更新但是不释放C/C++的数组

JNI_ABORT:对Java的数组不进行更新,释放C/C++的数组

?

在java中定义整数数组,要求在本地方法实现数组的排序,java代码为:

class="java" name="code">package com.example;


public class jni_test {

	//在本地方法sayHello里对数组进行排序
	public native void sayHello();
	
	int []my_arr={3,7,9,1,5,2,10,6};
	

	static{
		System.loadLibrary("NativeCode");
	}
	
    public static void main(String[] args) {
    	
    	jni_test temp=new jni_test();
    	
    	temp.sayHello();
    	
    	for(int i=0;i<temp.my_arr.length;i++)
    	{
    		System.out.println(temp.my_arr[i]);
    	}
    }
    	
}

?

c++实现本地方法代码:

#include"com_example_jni_test.h"
#include<iostream>
using namespace std;

JNIEXPORT void JNICALL Java_com_example_jni_1test_sayHello(JNIEnv * evn, jobject obj)
{
	//获取java的Class
	jclass my_class=evn->GetObjectClass(obj);
	//获取数组属性id
	jfieldID arr_id=evn->GetFieldID(my_class,"my_arr","[I");
	//得到数组对象
	jintArray array=(jintArray)evn->GetObjectField(obj,arr_id);
	//把java数组转到c++数组
	jint * my_array=evn->GetIntArrayElements(array,NULL);
	//获取数组长度
	jsize size=evn->GetArrayLength(array);

	//利用冒泡排序进行排序
	bool change;int temp;
	for(int i=0;i<size-1;i++)
	{
		change=false;
		for(int j=size-1;j>i;j--)
		{
			if(my_array[j]<my_array[j-1])
			{
				temp=my_array[j];
				my_array[j]=my_array[j-1];
				my_array[j-1]=temp;
				change=true;
			}
		}
		if(!change)
			break;
	}
	//输出结果
	/*for(int i=0;i<size;i++)
		cout<<my_array[i]<<endl;*/
	//释放c++数组并更新java数组
	evn->ReleaseIntArrayElements(array,my_array,0);
		
}

?

运行结果:



?

上一篇: 面向对象(一) 下一篇: Android点击效果
发表评论
用户名: 匿名