JNIチュートリアル(例:this)は、オブジェクト内のプリミティブフィールドにアクセスする方法と、明示的な関数引数として(つまり、jarray
のサブクラスとして)提供される配列にアクセスする方法を非常にうまくカバーしています。しかし、ののjobject
にあるJava(プリミティブ)配列にアクセスするには?メインプログラムは、このようなものかもしれないJNIを使用してオブジェクト内の配列にアクセスする方法は?
class JavaClass {
...
int i;
byte[] a;
}
:たとえば、私は、次のJavaオブジェクトのバイト配列を操作したい
class Test {
public static void main(String[] args) {
JavaClass jc = new JavaClass();
jc.a = new byte[100];
...
process(jc);
}
public static native void process(JavaClass jc);
}
対応するC++側は次のようになります。
JNIEXPORT void JNICALL Java_Test_process(JNIEnv * env, jclass c, jobject jc) {
jclass jcClass = env->GetObjectClass(jc);
jfieldID iId = env->GetFieldID(jcClass, "i", "I");
// This way we can get and set the "i" field. Let's double it:
jint i = env->GetIntField(jc, iId);
env->SetIntField(jc, iId, i * 2);
// The jfieldID of the "a" field (byte array) can be got like this:
jfieldID aId = env->GetFieldID(jcClass, "a", "[B");
// But how do we operate on the array???
}
私はGetByteArrayElements
を使用することを考えていたが、それはその引数としてArrayType
を望んでいます。明らかに私は何かを欠いている。これに行く方法はありますか?
ありがとうございます; getterを使用するのは賢明です(そしてクリーナーでさえも)。 GetXXXFieldのような方法で配列フィールドを直接取得する方法を誰かが指摘していない限り、このようにしなければなりません。 –
私はフィールドの例を追加しました(基本的には、CallObjectMethodではなくGetObjectFieldを使用します)。私はもちろんそれがボックスから実行されることを保証することはできませんが、私はあなたが一般的な考えを得ることができることを願って:) – Daff
右!どういうわけか私はこれをやるためにもっと簡単な方法を見つけることを期待していたので、私は定義に戻ることを嫌っていました(「配列はオブジェクトです」:-)プログラミングの心理学...もう一度ありがとう! –