Soy relativamente nuevo en JNI y he aprendido los principios básicos de jugar con enteros y matrices en objetos Java usando JNI. Ahora estoy tratando de modificar/acceder a un objeto Java dentro de un objeto Java.Acceso a un objeto Java en un objeto Java en C usando JNI
He estado buscando en Internet y en Stack Overflow y todavía tengo que descubrir cómo hacerlo.
Aquí está el ejemplo.
En Java:
public class ObjectOne
{
private byte[] buff;
...
...
}
public class ObjectTwo
{
private ObjectOne obj;
...
...
}
En JNI, ¿cómo se accede "buff" de ObjectOne través ObjectTwo? Intenté algo como esto ...
JNIEXPORT void JNICALL Java_accessBuffThroughObjectTwo(JNIEnv *env, jobject obj, jobject objectTwo)
{
jclass clazz;
jclass bufferClazz;
jobject bufferJObject;
clazz = (*env)->GetObjectClass(env, objectTwo);
fid = (*env)->GetFieldID(env, clazz, "obj", "Ljava/lang/Object;");
bufferJObject = (*env)->GetObjectField(env, javascsicommand, fid);
bufferClazz = (*env)->GetObjectClass(env, bufferJObject); <-- Fails here for Access Violation
fid = (*env)->GetFieldID(env, bufferClazz, "buff", "[B");
}
¿Alguna ayuda sobre lo que estoy haciendo mal?
El primer paso es comprobar cada llamada JNI para ver si está fallando. Segundo: ¿qué es 'javascsicommand'? –
Creo que está pasando el valor incorrecto para la instancia 'obj' a [GetObjectField] (http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp16572) Ver el descriptor correcto: 'jobject GetObjectField (JNIEnv * env, jobject obj, jfieldID fieldID);' – oldrinb
¿Quizás quiso pasar 'objectTwo' en lugar de' javascsicommand'? – oldrinb