JNI学習3:配列アクセス(1)——単純タイプ配列
転載は出典を明記してください.
この文書の出典リンク:http://blog.csdn.net/zgyulongfei/article/details/7413012
Javaには2つの配列があります.1つはint[]intArrとdouble[]dArrなどの単純なタイプの配列です.もう1つは、String[]strArrおよびObject[]objArrrなどのオブジェクトタイプ配列です.
このブログでは、単純なタイプの配列へのアクセスについて説明し、次にオブジェクトタイプの配列へのアクセスについて説明します.
余計なことを言わないで,番号をつけなさい!!
JAvaコードは次のとおりです.
書き終わったらコンパイルし、hヘッダファイルを生成し、cコードを作成します.
(エラー)cコードは次のとおりです.
エラーの原因:c言語はjava配列に直接アクセスできません.
正しいコードはここで2つの書き方を提供します.
(正しい1-1)cコードは以下の通りである.
出力結果: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コードは以下の通りである.
1-1 1−2との違いも明らかであり、1−1はintArrayの値をバッファarrにコピーし、1−2はarrを配列intArrayに指向する.
今日はここまでですが、時間があまりないので、次回に続きます~
------------------------------------
ソースコードのダウンロード:http://download.csdn.net/detail/zgyulongfei/4187824
この文書の出典リンク: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