0

Java では、 などの非プリミティブ オブジェクトの多次元配列Integer[][] arrが定義されています。arrJNI経由でCプログラムの配列にアクセスするにはどうすればよいですか?

public class Foo {
    public static Integer[][] arr = {{0}, {1, 2}, {3, 4, 5}};
}
4

2 に答える 2

8

まず、フィールド ID を取得します。

jclass clazz = (*env)->FindClass(env, "fully/qualified/package/Foo");
jfieldID field = (*env)->GetFieldID(env, clazz, "arr", "[[Ljava/lang/Integer;" );

次に、これを使用して実際のフィールドを取得する必要があります。と呼ばれるjobject型があるとします:FoofooObj

jobject arrObj = (*env)->GetObjectField(env, fooObj, field);

arrにキャストできjObjectArray、jni 配列関数を使用して配列を操作できます。ドキュメントはここにあります。

Integer オブジェクトの 2D 配列があるため、通常の方法で Integer クラスからプリミティブ型を取得する必要があります。

于 2013-10-10T21:11:01.153 に答える
1

現在、一部の非プリミティブ オブジェクトの多次元配列を Java プログラムから C プログラムに直接転送することはできません。

この問題の解決策は、プリミティブでない多次元配列のプリミティブ バージョンを作成し、プリミティブな多次元配列を Java から C に転送することです。とにかく、そのような多次元配列はjobjectArrayネイティブに転送されます。

整数の 2 次元配列の操作の概要は次のとおりです。

  1. Java でプリミティブでない多次元配列のプリミティブ バージョンを作成します。
  2. jobjectArrayネイティブ C プログラムのように配列を取得します。
  3. 各行GetObjectArrayElementを反復するために使用します。
  4. 関数を使用して各セルGetIntArrayElements繰り返します。jint *val = (*env)->GetIntArrayElements(env, row, NULL);
于 2013-10-11T17:18:09.683 に答える