![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Eugene128 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Здравствуйте. У меня следующая проблема.
Имеется программа, написанная на С++ (с пользовательским интерфейсом и реалезацией кой-какого алгоритма). 1. Эта программа должна иметь возможность запускать другую программу, написанную на Java. 2. После настройки начальных параметров и запуска програмы, на выходе получается некоторый набор значений, который и передается java-программе. 3. java-программа должна обрабатывать эти значения, И еще должна иметь возможность передавать данные обратно С++ программе, с указанием того что с ними делать, т.е., как я понимаю: 3.1. Либо вызывать методы С++-программы. 3.2. Либо класть данные в какой-нибудь файл, и все-равно сообщать С++ программе, что данные положены в файл и их следовало бы взять. с 1. и 2. вроде понятно - с использованием JNI (invocation) это вроде можно сделать.... а вот с остальным не ясно... Может кто сможет помочь? |
|||
|
||||
| Metal_Heart |
|
|||
|
а почему бы и нет? ![]() ![]() Профиль Группа: Участник Сообщений: 728 Регистрация: 31.3.2005 Где: Москва Репутация: 4 Всего: 12 |
Eugene128, если прога на Срр вызывает прогу на Яве, то прога на Яве не должна вызывать методов проги Срр. По-моему так.
Прога на Срр вызывает и инициализирует прогу на Яве, затем дожидается когда ЯваПрога отработает и забирает данные сама. Обмен между прогами можно сделать на файлах, сокетах, потоках и, может быть, на чем-нибудь ещё ... -------------------- не стыдно учиться, а стыдно не учиться |
|||
|
||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 10 Всего: 18 |
Прога на C++ может запустить прогу на Java. Прога на Javа, в свою очередь, через нативные методы может вызывать код, написанный на C++.
И наоборот, прога на Javа через нативные методы может вызывать код, написанный на C++, который может вызывать методы Java классов. Обмен информацией может быть двусторонним в любом случае. -------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
| Eugene128 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Разве? Сначала: запускаем С-прогу, она вызывает Java-прогу. Вот теперь нужно, например, чтобы из Java-проги можно было бы в С-проге вызвать метод А. Для этого, как я понимаю, нужно засунуть его (А) в dll-ку вместе с JNI-методом (который вызывает метод А). НО: метод А, например, использует другие методы и использует различные объекты, следовательно и их тоже надо засунуть в dll, так? Не получится ли в итоге, что так как вся прога, ясен перец, связанная, то всю её надо засунуть в dll будет |
|||
|
||||
| Eugene128 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Выскажите, пожалуйста, свое мнение по поводу вот такой организации взаимодействия:
(с использованием JNI и сокетов) 1. Запускается С-прога 2. С- прога "объявляет себя сервером" и запускает Java-прогу (с использованием JNI). 3. При запуске Java-прога "объявляет себя клиентом" и коннектится к С-проге. 4. Дальше можно обмениваться данными туды-сюды... Как считаете? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
1. Взаимодействие через сокеты дольше, чем через JNI (не знаю насколько тут критична скорость).
2. Если идет взаимодействие через сокет, то зачем тут вообще JNI? Одновременный запуск 2-х программ, можно организовать намного проще. -------------------- 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. |
|||
|
||||
| Eugene128 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Конечно лучше через JNI, но тогда вот так чтоль придется делать: 1. Засунуть всю прогу на С++(а она здоровая достаточно) в dll, кроме метода main 2. Соответственно сделать exe-шник(метод main, а dll отдельно), который этой dll будет пользоваться с одной стороны, и Java прога с другой стороны... Так чтоль получается??? |
|||
|
||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 10 Всего: 18 |
При чём тут dll'ки-то?
-------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Определись с тем, надо тебе отдельно запускать приложения или нет.
Если такой необходимости нет, и нет необходимости в удаленном взаимодействии, то: запускаешь программу на С++, она в свою очередь инициализирует и запускает JVM, и при необходимости вызывает нужные методы твоей Java программы, и наоборот. -------------------- 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. |
|||
|
||||
| Eugene128 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Так как наоборот? Я наверно плохо понимаю как работает JNI... В Java программе надо указать где искать нативные методы с помощью System.loadLibrary("TempCalcJava"), где TempCalcJava то место где искать надо, и че-то во всех примерах которые я видел - это dll (TempCalcJava.dll). Или здесь можно указать название exe-шника сишного? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
System.loadLibrary() нужно для того, чтобы библиотека была загружена в память процесса. В твоем случае достаточно чтобы exe экспортировал нужные тебе JNI функции, и System.loadLibrary() не понадобится.
-------------------- 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. |
|||
|
||||
| Eugene128 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
А не подскажете как экспортировать нужные JNI функции?
|
|||
|
||||
| alex_nevolin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 13.8.2007 Репутация: 3 Всего: 4 |
||||
|
||||
| Eugene128 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Я этот докусент уже видел... Видел собственно говоря и Invocation API...
Но дело в том, что в примере там все понятно: запускаем ява машину, а затем находим ява класс и вызываем ява метод. Это я понимаю... Но вот теперь мне надо из явы вызвать метод С++. LSD сказал, что нужно чтобы exe экспортировал нужные мне JNI функции. (а я знаю только как их их dll вытаскивать). Так вот я не знаю как сделать то, что сазал LSD............... |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Это тебе уже лучше спросить в разделе C++, но для начала попробуй просто имплементировать те заготовки которые тебе даст javah. По идее они уже должны содержать декларацию експорта. -------------------- 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. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |