JNI学習3:配列アクセス(1)——単純タイプ配列


転載は出典を明記してください.
この文書の出典リンク:http://blog.csdn.net/zgyulongfei/article/details/7413012
Javaには2つの配列があります.1つはint[]intArrとdouble[]dArrなどの単純なタイプの配列です.もう1つは、String[]strArrおよびObject[]objArrrなどのオブジェクトタイプ配列です.
このブログでは、単純なタイプの配列へのアクセスについて説明し、次にオブジェクトタイプの配列へのアクセスについて説明します.
余計なことを言わないで,番号をつけなさい!!
JAvaコードは次のとおりです.
class PrimitiveArrayDemo
{
	private native int sum(int [] intArray, int num);
	public static void main(String [] args)
	{
		PrimitiveArrayDemo demo = new PrimitiveArrayDemo();
		int num = 10;
		int [] intArray = new int[num];
		for(int i = 0; i < num; ++i)
		{
			intArray[i] = i;
		}
		int sum = demo.sum(intArray, num);
		System.out.println("sum of intArray is " + sum);
	}
	static
	{
		System.loadLibrary("PrimitiveArrayDemo");
	}
}

書き終わったらコンパイルし、hヘッダファイルを生成し、cコードを作成します.
 
(エラー)cコードは次のとおりです.
#include <jni.h>
#include "PrimitiveArrayDemo.h"

JNIEXPORT jint JNICALL Java_PrimitiveArrayDemo_sum(JNIEnv *env, jobject obj, jintArray intArray, jint num)
{
	int i, sum = 0;
	for(i = 0; i < num; ++i)
		sum += intArray[i];
	return sum;
}

エラーの原因:c言語はjava配列に直接アクセスできません.
正しいコードはここで2つの書き方を提供します.
(正しい1-1)cコードは以下の通りである.
#include <jni.h>
#include "PrimitiveArrayDemo.h"

JNIEXPORT jint JNICALL Java_PrimitiveArrayDemo_sum(JNIEnv *env, jobject obj, 
												   jintArray intArray, jint num)
{
	//     20      
	jint arr[20];
	int i, sum = 0;	
	(*env)->GetIntArrayRegion(env, intArray, 0, (jsize)num, arr);//  1-1
	for(i = 0; i < num; ++i)
	{
		sum += arr[i];
	}
	return sum;
}

出力結果:sum of intArrayis 45
注記1-1:関数定義void GetIntArrayRegion(JNIEnv*env,jintArray array, jsize start, jsize len, jint *buf);
≪アクション|Actions|emdw≫:基本タイプの配列の領域をバッファ内の関数のセットにコピーします.配列arrayをstartからlenにコピーするデータをbufにコピーします.
 
(正しい1-2)cコードは以下の通りである.
#include <jni.h>
#include "PrimitiveArrayDemo.h"

JNIEXPORT jint JNICALL Java_PrimitiveArrayDemo_sum(JNIEnv *env, jobject obj, 
												   jintArray intArray, jint num)
{
	jint *arr;
	jint i, sum = 0;
	//GetIntArrayElements()      intArray   。
	arr = (*env)->GetIntArrayElements(env, intArray, NULL);
	if(arr == NULL)
		return 0;
	for(i = 0; i < num; ++i)
	{
		sum += arr[i];
	}
	//      
	(*env)->ReleaseIntArrayElements(env, intArray, arr, 0);
	return sum;
}

1-1  1−2との違いも明らかであり、1−1はintArrayの値をバッファarrにコピーし、1−2はarrを配列intArrayに指向する.
今日はここまでですが、時間があまりないので、次回に続きます~
------------------------------------
ソースコードのダウンロード:http://download.csdn.net/detail/zgyulongfei/4187824