JNI tutoriales, por ejemplo this, cubre bastante bien cómo acceder a campos primitivos dentro de un objeto, así como también cómo acceder a matrices que se proporcionan como argumentos explícitos de funciones (es decir, como subclases de jarray
). Pero, ¿cómo acceder a las matrices Java (primitivas) que son campos dentro de y jobject
? Por ejemplo, me gustaría operar en la matriz de bytes de los siguientes objetos de Java:¿Cómo acceder a las matrices dentro de un objeto con JNI?
class JavaClass {
...
int i;
byte[] a;
}
El programa principal podría ser algo como esto:
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);
}
El correspondiente C++ lado sería entonces:
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???
}
estaba pensando usar GetByteArrayElements
, pero quiere una ArrayType
como su argumento. Obviamente me falta algo. ¿Hay alguna forma de hacerlo?
Gracias; es inteligente (y tal vez incluso más limpio) usar getters. Tendré que hacerlo de esta manera a menos que alguien señale cómo obtener directamente los campos de la matriz, en forma de GetXXXField. –
Ok, le agregué un ejemplo para el campo (básicamente solo uso GetObjectField en lugar de CallObjectMethod). Aunque, por supuesto, no puedo garantizar que se ejecutará de la caja espero que pueda obtener la idea general :) – Daff
¡Correcto! De alguna manera, esperaba encontrar una forma un poco más directa de hacerlo, y por eso me resistí a volver a las definiciones ("array es un objeto" :-) Programación de la psicología ... ¡Gracias de nuevo! –