Java では、 などの非プリミティブ オブジェクトの多次元配列Integer[][] arr
が定義されています。arr
JNI経由でCプログラムの配列にアクセスするにはどうすればよいですか?
public class Foo {
public static Integer[][] arr = {{0}, {1, 2}, {3, 4, 5}};
}
Java では、 などの非プリミティブ オブジェクトの多次元配列Integer[][] arr
が定義されています。arr
JNI経由でCプログラムの配列にアクセスするにはどうすればよいですか?
public class Foo {
public static Integer[][] arr = {{0}, {1, 2}, {3, 4, 5}};
}
まず、フィールド ID を取得します。
jclass clazz = (*env)->FindClass(env, "fully/qualified/package/Foo");
jfieldID field = (*env)->GetFieldID(env, clazz, "arr", "[[Ljava/lang/Integer;" );
次に、これを使用して実際のフィールドを取得する必要があります。と呼ばれるjobject
型があるとします:Foo
fooObj
jobject arrObj = (*env)->GetObjectField(env, fooObj, field);
arr
にキャストできjObjectArray
、jni 配列関数を使用して配列を操作できます。ドキュメントはここにあります。
Integer オブジェクトの 2D 配列があるため、通常の方法で Integer クラスからプリミティブ型を取得する必要があります。
現在、一部の非プリミティブ オブジェクトの多次元配列を Java プログラムから C プログラムに直接転送することはできません。
この問題の解決策は、プリミティブでない多次元配列のプリミティブ バージョンを作成し、プリミティブな多次元配列を Java から C に転送することです。とにかく、そのような多次元配列はjobjectArray
ネイティブに転送されます。
整数の 2 次元配列の操作の概要は次のとおりです。
jobjectArray
ネイティブ C プログラムのように配列を取得します。GetObjectArrayElement
を反復するために使用します。GetIntArrayElements
繰り返します。jint *val = (*env)->GetIntArrayElements(env, row, NULL);