java_jni详解_03

直接看代码

public class IntArray{
	
   public native int sumArray(int arr[]);  //声明本地方法
   
   public static void main(String[] args) {
	   IntArray p = new IntArray();
	   int arr[] = new int[10];
	   for (int i = 0; i < 10; i++) {
		 arr[i] = i;
	   }
	   int sum = p.sumArray(arr);
	   
	   System.out.println("sum = "+sum);
   }
   
   static{
	   //System.loadLibrary("helloworld"); // 加载库文件
	   System.load("/Users/zhaoshun/solibs/libIntArr.so");
   }
}

/**
 *   JNI 对每种数据类型的数组都有对应的函数。
 *   如下直接操作数组是错误的:
	 JNIEXPORT jint JNICALL
	 Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) {
		int i,sum=0;
		for(i=0;i<10;i++){
		  sum += arr[i]; 
		}
	 }
	 JNI 中数组的基类为 jarray,其他如 jintArray 都继承自 jarray。
	 
	 头文件内容
	 * Class:     jni_sample_IntArray
	 * Method:    sumArray
	 * Signature: ([I)I
	JNIEXPORT jint JNICALL Java_jni_sample_IntArray_sumArray(JNIEnv *, jobject, jintArray);
	
	运行结果:
	sum = 45
 */



#include <jni.h>
#include <stdio.h>  
#include "jni_sample_IntArray.h"
// printf 在stdio.h头文件中
JNIEXPORT jint JNICALL Java_jni_sample_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
	jint buf[10];
	jint i,sum = 0;
	(*env)->GetIntArrayRegion(env,arr,0,10,buf);  //把 arr 赋值给了 buf?
	for (i = 0;i<10;i++) {
		sum += buf[i];
	}
	return sum;
}

/**

使用 GetIntArrayRegion 拷贝数组内容到 buf 中,这里没有做越界异常检测, 因为知道数组有 10 个,参数 3 为待拷贝数组的起始位置,参数 4 为拷贝元素的个数。
JNI 支持 SetIntArrayRegion 允许重新设置数组一个区域的值,其他基本类型(boolean, short, 和float)也有对应的支持。
JNI 支持通过 Get/Release<Type>ArrayElemetns 返回 Java 数组的一个拷贝(实现优良的 VM,会返回指向 Java 数组的一个直接的指针,并标记该内存区域,不允许被 GC)。

JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
	jint *carr;
	jinti,sum=0;
	carr = (*env)->GetIntArrayElements(env, arr, NULL); 
	if (carr == NULL) {
	  return 0; 
	}
	for (i=0; i<10; i++) { 
		sum += carr[i];
	}
	(*env)->ReleaseIntArrayElements(env, arr, carr, 0);
	return sum; 
	}
GetArrayLength 返回数组元素个数。
*/










猜你喜欢

转载自abc20899.iteye.com/blog/1864960