Re: jni. Чтение в C++ методе поля вложенного java объекта
От: alsemm Россия  
Дата: 10.12.09 16:07
Оценка: 5 (2) +1
Здравствуйте, TnedutS, Вы писали:

TS>Всем привет!

TS>Коротко проблема обрисована в теме. Сама задача является тестовой "чтобы разобраться".
TS>Теперь подробнее.
TS>В java — объекте класса HelloWorld есть нативный метод print, который должен вывести на экран содержимое поля a объекта TestObject, который в свою очередь является полем cfvjобъекта класса HelloWorld


TS>
TS>class HelloWorld {
TS>  public class TestClass{
TS>    public String a = "abc";
TS>  }
TS>  public TestClass TestObject;
TS>  private native void print();
TS>  public static void main(String[] args) {
TS>  new HelloWorld().print();
TS>  }
TS>  static {
TS>    System.loadLibrary("HelloWorldLib");
TS>  }
TS>}
TS>


TS>Нативный метод на c++ определен в dll-ке HelloWorld и выглядит так.

TS>Работающая часть метода списана из документации

TS>[ccode]

TS>#include <stdio.h>
TS>#include "jni.h"
TS>#include "HelloWorld.h"

TS>JNIEXPORT void JNICALL

TS>Java_HelloWorld_print(JNIEnv *env, jobject obj)
TS>{
TS> jfieldID fid1,fid2; /* store the field ID */
TS> jobject jEmbObj;
TS> jstring jstr;
TS> const char *str;

TS> jclass cls1, cls2;

TS> /* Get a reference to obj's class */
TS> cls1 = (*env)->GetObjectClass(env, obj);

TS> /* Look for the instance field s in cls */

TS> fid1 = (*env)->GetFieldID(env, cls1, "TestObject",
TS> "LHelloWorld$TestClass;");
TS> if (fid1 == NULL) {
TS> return; /* failed to find the field */
TS> }

TS> // Read the instance field TestObject

TS> jEmbObj = (*env)->GetObjectField(env, obj, fid1);
// Скорее всего jEmbObj = null, т.к. полагаю, что никто поле TestObject не инициализировал (судя по коду класса HelloWorld)

TS> // Get a reference to obj's class

TS> cls2 = (*env)->GetObjectClass(env, jEmbObj);//***
// Скормил в GetObjectClass вторым аргументом null, он и умер.
TS>#

TS>Проблемы возникают со строкой ***. Если ее и все ниже комментировать, ошибок не возникает.

TS>Вопрос: как получить доступ к полям вложенных объектов?
Добавить проверки в нативный код и инициировать TestObject поле:

public TestClass TestObject = new TestClass();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.