Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов java метода из C++ через JNI 
:(
    Опции темы
x8m6
Дата 16.12.2010, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Нужно вызвать метод у java- объекта через JNI.
Вопрос 1: Как получить указатель на интерфейс env?
Вопрос 2: Как получить уже созданный в памяти java-объект (именно получить с уже заполненными полями, а не создать новый экземпляр)?



Это сообщение отредактировал(а) x8m6 - 17.12.2010, 00:02
PM MAIL   Вверх
LSD
Дата 17.12.2010, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(x8m6 @  16.12.2010,  23:36 Найти цитируемый пост)
Как получить указатель на интерфейс env?

Это будет первый аргумент переданный в этот метод.
Код

JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
  (JNIEnv * env, jobject jobj, jstring name) {
...




Цитата(x8m6 @  16.12.2010,  23:36 Найти цитируемый пост)
Вопрос 2: Как получить уже созданный в памяти java-объект (именно получить с уже заполненными полями, а не создать новый экземпляр)?

Вызвать Java метод который вернет тебе ссылку на этот объект: Calling Instance Methods. Или получить ссылку из поля: Accessing Fields.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
x8m6
Дата 17.12.2010, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Цитата

Это будет первый аргумент переданный в этот метод.

Мне нельзя вызывать нативный код в Java. 


Цитата

Вызвать Java метод который вернет тебе ссылку на этот объект


Код

jobject thd = ...; /* a java.lang.Thread instance */
 jmethodID mid;
 jclass runnableIntf = 
     (*env)->FindClass(env, "java/lang/Runnable");
 if (runnableIntf == NULL) {
     ... /* error handling */
 }
 mid = (*env)->GetMethodID(env, runnableIntf, "run", "()V");
 if (mid == NULL) {
     ... /* error handling */
 }
 (*env)->CallVoidMethod(env, thd, mid);
 ... /* check for possible exceptions */



т.е. получается чтобы вызвать метод у объекта уже нужно иметь ссылку на этот объект - в данном примере thd. Откуда ее взять? Или можно ее занулить, тогда  после вызова метода вернется объект?
И как получить нужный мне экземпляр(c требуемыми значениями полей)? Я так понимаю что никак. Единст. способ - это синглтон.


Это сообщение отредактировал(а) x8m6 - 17.12.2010, 23:18
PM MAIL   Вверх
LSD
Дата 20.12.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(x8m6 @  18.12.2010,  00:14 Найти цитируемый пост)
Мне нельзя вызывать нативный код в Java.

Тогда я вообще не понимаю, как твой код на C++ должен получить управление.


Цитата(x8m6 @  18.12.2010,  00:14 Найти цитируемый пост)
т.е. получается чтобы вызвать метод у объекта уже нужно иметь ссылку на этот объект - в данном примере thd. Откуда ее взять? Или можно ее занулить, тогда  после вызова метода вернется объект?
И как получить нужный мне экземпляр(c требуемыми значениями полей)? Я так понимаю что никак. Единст. способ - это синглтон.

Это уже вопрос не по JNI, это скорее архитектура. Где и как хранить ссылку, чтобы ее можно было получить из произвольного участка кода.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
x8m6
Дата 20.12.2010, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Цитата

Тогда я вообще не понимаю, как твой код на C++ должен получить управление.

получить ссылку на запущенную JVM, от туда достать как-то env.





PM MAIL   Вверх
LSD
Дата 22.12.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(x8m6 @  20.12.2010,  21:47 Найти цитируемый пост)
получить ссылку на запущенную JVM, от туда достать как-то env.

Ты хочешь внедриться в уже запущенную JVM? Ну тогда тебе точно не сюда, с помощью JNI внедрится в другой процесс нельзя. И как это сделать будет зависеть от того какая ОС используется.

А вообще, есть JMX с помощью которого можно из другого процесса получить некие данные из уже запущенной JVM.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Vitaly333
Дата 22.12.2010, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Цитата

с помощью JNI внедрится в другой процесс нельзя.

А как же вот этот метод из jni.h:
Код

_JNI_IMPORT_OR_EXPORT_ jint JNICALL
JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);


PM MAIL   Вверх
LSD
Дата 23.12.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Vitaly333 @  22.12.2010,  15:00 Найти цитируемый пост)
А как же вот этот метод из jni.h:

А что такого в этом методе?
Invocation API
Цитата
JNI_GetCreatedJavaVMs

jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen,
jsize *nVMs);

Returns all Java VMs that have been created. Pointers to VMs are written in the buffer vmBuf in the order they are created. At most bufLen number of entries will be written. The total number of created VMs is returned in *nVMs.

JDK 1.1.2 does not support creating more than one VM in a single process.

То что можно создать JVM из native приложения, не означает, что можно так же просто внедрится в уже запущенную JVM.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1156 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.