Всем привет!
Коротко проблема обрисована в теме. Сама задача является тестовой "чтобы разобраться".
Теперь подробнее.
В 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.