jni. Чтение в C++ методе поля вложенного java объекта
От: TnedutS  
Дата: 10.12.09 15:36
Оценка:
Всем привет!
Коротко проблема обрисована в теме. Сама задача является тестовой "чтобы разобраться".
Теперь подробнее.
В java — объекте класса HelloWorld есть нативный метод print, который должен вывести на экран содержимое поля a объекта TestObject, который в свою очередь является полем cfvjобъекта класса HelloWorld


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


Нативный метод на c++ определен в dll-ке HelloWorld и выглядит так.
Работающая часть метода списана из документации

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

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

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

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

  // Read the instance field TestObject
  jEmbObj = (*env)->GetObjectField(env, obj, fid1);
  // Get a reference to obj's class
  cls2 = (*env)->GetObjectClass(env, jEmbObj);//***
  // Look for the instance field a in cls
  fid2 = (*env)->GetFieldID(env, cls2, "a",
  "Ljava/lang/String;");

  if (fid2 == NULL) {
    return; // failed to find the field
  }

  // Read the instance field s
  jstr = (*env)->GetObjectField(env, jEmbObj, fid2);
  str = (*env)->GetStringUTFChars(env, jstr, NULL);
  if (str == NULL) {
    return; // out of memory
  }
  printf(" c.s = \"%s\"\n", str);
  (*env)->ReleaseStringUTFChars(env, jstr, str);

  return;
}


В этой строке с помощью GetObjectClass я хотел получить класс вложенного объекта, а потом дальше по аналогии GetFieldID — GetObjectField — GetStringUTFChars получить доступ к полям уже вложенного объекта.
По-моему здесь http://rsdn.ru/forum/java/3366520.aspx
Автор: denis.zhdanov
Дата: 21.04.09

как раз такая идея и изложена.
Похожая идея и тут.
http://www.experts-exchange.com/Programming/Languages/Java/Q_11830578.html


Dll-ка компилируется.
Однако при использовании в java сразу возникают ошибка.
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d6c5b38, pid=3868, tid=3888
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_03-b07 mixed mode)
# Problematic frame:
# V [jvm.dll+0x85b38]
#
# An error report file with more information is saved as hs_err_pid3868.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#

Проблемы возникают со строкой ***. Если ее и все ниже комментировать, ошибок не возникает.
Вопрос: как получить доступ к полям вложенных объектов?
Причем в перспективе требуется не только чтение.
Си часть должна считывать информацию(структуры различные) из файла и передавать в java.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.