Здравствуйте, 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();