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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JNI Обращение к экземпляру TForm, Работа с объектом с++ наследником TForm 
:(
    Опции темы
ViktorOff
Дата 19.6.2015, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, уважаемые форумчане!
Ввиду небольшого опыта работы в Java уповаю на вашу помощь.
Задача: в коде на Java обратиться к экземпляру Класса с++ наследника TForm. Пробую использовать JNI.
В коде на Java храню переменную nativeHandle (получаю в методе TestJNIForm.initialise()), где находится указатель на экземпляр созданной формы в с++.
В процедуре getForm вытаскиваю ее из Java и привожу к TForm.

Код

//---------------------------------------------------------------------------
 
TForm *getForm(JNIEnv *env, jobject obj)
{
    jfieldID HandleField= env->GetFieldID(env->GetObjectClass(obj), "nativeHandle", "J");
    jlong handle = env->GetLongField(obj, HandleField);
    return reinterpret_cast<TForm *>(handle);
}
//---------------------------------------------------------------------------
 
jlong JNICALL Java_my_TestJNIForm_initialise(JNIEnv *, jobject)
{
    TForm *form=new TForm(Application);
    form->Caption="1";
    return (jlong)form;
}
//---------------------------------------------------------------------------
 
void JNICALL Java_my_TestJNIForm_show(JNIEnv *env, jobject obj)
{
    TForm *form = getForm(env, obj);
    form->Show();
}
//---------------------------------------------------------------------------
 
jint JNICALL Java_my_TestJNIForm_getVal(JNIEnv *env, jobject obj)
{
    TForm *form = getForm(env, obj);
    return StrToInt(form->Caption);
}
//---------------------------------------------------------------------------
 
void JNICALL Java_my_TestJNIForm_setVal(JNIEnv *env, jobject obj, jint val)
{
    TForm *form = getForm(env, obj);
    form->Caption=IntToStr(val);
}
//---------------------------------------------------------------------------


Проблема заключается в следующем. Если в Java-коде вызываю метод TestJNIForm.show(), то форма показывается и подвисает. Если вызываю ее в отдельном процессе, то она показывается на мгновение и закрывается. Если в с-коде использовать ShowModal, то отображается нормально, но взаимодействие недоступно. (Взаимодействие для простоты условно реализовано в методах TestJNIForm.setVal(), TestJNIForm.getVal(), изменение заголовка формы, в численном виде, чтобы не отвлекаться на работу со строками)
В англоязычном секторе интернета нашел пост, где чел интересовался проблемой один в один с этой, но ему никто не ответил. Буду очень признателен за любые мысли по данному поводу.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  code.ZIP 1,52 Kb
PM MAIL   Вверх
AntonSaburov
Дата 19.6.2015, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Я не уверен, что такое сможет сработать. В Java и в c++ выделаются куски памяти, которыми управлять явно надо на разном уровне. И попытка сотворить то, что хочется, на мой взгляд, обречена на неудачу.
Здесь надо очень глуюоко полазить по понманию как память выделяется в JNI.
PM MAIL WWW ICQ   Вверх
ViktorOff
Дата 19.6.2015, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сам подход, держать в java long handle, а в с приводить его к указателю на объект стырена у достаточно авторитетного забугорного блогера, и все вроде нормально функционирует кроме случая vcl формы, может проблема всеж не так глобальна?
PM MAIL   Вверх
ViktorOff
Дата 21.6.2015, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Возможно, я излагаю проблему достаточно путанно. Убрал все лишнее.
Из java вызываю нативный метод для показа vcl формы.

Код

package my;

import javax.swing.JFrame;

public class TestJNIForm {

    public TestJNIForm() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        showVCLForm();
    }

    public static void main(String[] args) {
        new TestJNIForm();
    }

    static {
        System.loadLibrary("JNIForm");
    }

    private native void showVCLForm();
}


В dll на  Borland c builder 6 реализую метод вызова  vcl формы. 

Код

//---------------------------------------------------------------------------

void JNICALL Java_my_TestJNIForm_showVCLForm(JNIEnv *, jobject)
{
    TForm *form=new TForm(Application);
    form->Show();
}
//---------------------------------------------------------------------------


Запускаю программу, форма показалась, но увы, висит. Есть мысли, что не так?
PM MAIL   Вверх
Mirkes
Дата 25.6.2015, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что значит "висит"? Не хочет взаимодействовать с Java или с пользователем? Подозреваю, что вся обработка событий должна быть написана на с++ и Java должна связываться через специальные методы объекта (с++).


--------------------
Mirkes
PM MAIL   Вверх
ViktorOff
Дата 26.6.2015, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Висит в прямом смысле, знак песочных часов, форма не реагирует на клики мыши. Т.е. проблема уже на этапе form->Show(). Это видимо из-за передачи Application в конструктор. Если передавать NULL, то этого не происходит. Вероятно надо вручную прописывать очередь сообщений в с.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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