| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > как сделать с JNI? |
| Автор: Eugene128 18.10.2007, 01:38 |
| Здравствуйте. У меня следующая проблема. Имеется программа, написанная на С++ (с пользовательским интерфейсом и реалезацией кой-какого алгоритма). 1. Эта программа должна иметь возможность запускать другую программу, написанную на Java. 2. После настройки начальных параметров и запуска програмы, на выходе получается некоторый набор значений, который и передается java-программе. 3. java-программа должна обрабатывать эти значения, И еще должна иметь возможность передавать данные обратно С++ программе, с указанием того что с ними делать, т.е., как я понимаю: 3.1. Либо вызывать методы С++-программы. 3.2. Либо класть данные в какой-нибудь файл, и все-равно сообщать С++ программе, что данные положены в файл и их следовало бы взять. с 1. и 2. вроде понятно - с использованием JNI (invocation) это вроде можно сделать.... а вот с остальным не ясно... Может кто сможет помочь? |
| Автор: Metal_Heart 18.10.2007, 08:34 |
| Eugene128, если прога на Срр вызывает прогу на Яве, то прога на Яве не должна вызывать методов проги Срр. По-моему так. Прога на Срр вызывает и инициализирует прогу на Яве, затем дожидается когда ЯваПрога отработает и забирает данные сама. Обмен между прогами можно сделать на файлах, сокетах, потоках и, может быть, на чем-нибудь ещё ... |
| Автор: AlexeyVorotnikov 18.10.2007, 08:52 |
| Прога на C++ может запустить прогу на Java. Прога на Javа, в свою очередь, через нативные методы может вызывать код, написанный на C++. И наоборот, прога на Javа через нативные методы может вызывать код, написанный на C++, который может вызывать методы Java классов. Обмен информацией может быть двусторонним в любом случае. |
| Автор: Eugene128 18.10.2007, 19:33 | ||
Разве? Сначала: запускаем С-прогу, она вызывает Java-прогу. Вот теперь нужно, например, чтобы из Java-проги можно было бы в С-проге вызвать метод А. Для этого, как я понимаю, нужно засунуть его (А) в dll-ку вместе с JNI-методом (который вызывает метод А). НО: метод А, например, использует другие методы и использует различные объекты, следовательно и их тоже надо засунуть в dll, так? Не получится ли в итоге, что так как вся прога, ясен перец, связанная, то всю её надо засунуть в dll будет |
| Автор: Eugene128 19.10.2007, 20:39 |
| Выскажите, пожалуйста, свое мнение по поводу вот такой организации взаимодействия: (с использованием JNI и сокетов) 1. Запускается С-прога 2. С- прога "объявляет себя сервером" и запускает Java-прогу (с использованием JNI). 3. При запуске Java-прога "объявляет себя клиентом" и коннектится к С-проге. 4. Дальше можно обмениваться данными туды-сюды... Как считаете? |
| Автор: LSD 22.10.2007, 09:44 |
| 1. Взаимодействие через сокеты дольше, чем через JNI (не знаю насколько тут критична скорость). 2. Если идет взаимодействие через сокет, то зачем тут вообще JNI? Одновременный запуск 2-х программ, можно организовать намного проще. |
| Автор: Eugene128 22.10.2007, 23:13 | ||
Конечно лучше через JNI, но тогда вот так чтоль придется делать: 1. Засунуть всю прогу на С++(а она здоровая достаточно) в dll, кроме метода main 2. Соответственно сделать exe-шник(метод main, а dll отдельно), который этой dll будет пользоваться с одной стороны, и Java прога с другой стороны... Так чтоль получается??? |
| Автор: AlexeyVorotnikov 23.10.2007, 10:09 |
| При чём тут dll'ки-то? |
| Автор: LSD 23.10.2007, 18:58 |
| Определись с тем, надо тебе отдельно запускать приложения или нет. Если такой необходимости нет, и нет необходимости в удаленном взаимодействии, то: запускаешь программу на С++, она в свою очередь инициализирует и запускает JVM, и при необходимости вызывает нужные методы твоей Java программы, и наоборот. |
| Автор: Eugene128 23.10.2007, 19:11 | ||
Так как наоборот? Я наверно плохо понимаю как работает JNI... В Java программе надо указать где искать нативные методы с помощью System.loadLibrary("TempCalcJava"), где TempCalcJava то место где искать надо, и че-то во всех примерах которые я видел - это dll (TempCalcJava.dll). Или здесь можно указать название exe-шника сишного? |
| Автор: LSD 23.10.2007, 19:18 |
| System.loadLibrary() нужно для того, чтобы библиотека была загружена в память процесса. В твоем случае достаточно чтобы exe экспортировал нужные тебе JNI функции, и System.loadLibrary() не понадобится. |
| Автор: Eugene128 23.10.2007, 19:41 |
| А не подскажете как экспортировать нужные JNI функции? |
| Автор: alex_nevolin 24.10.2007, 09:34 |
| http://www.realcoding.net/article/view/2024 Обратите внимание на "INVOCATION API" |
| Автор: Eugene128 24.10.2007, 11:29 |
| Я этот докусент уже видел... Видел собственно говоря и Invocation API... Но дело в том, что в примере там все понятно: запускаем ява машину, а затем находим ява класс и вызываем ява метод. Это я понимаю... Но вот теперь мне надо из явы вызвать метод С++. LSD сказал, что нужно чтобы exe экспортировал нужные мне JNI функции. (а я знаю только как их их dll вытаскивать). Так вот я не знаю как сделать то, что сазал LSD............... |
| Автор: LSD 24.10.2007, 13:33 |
Это тебе уже лучше спросить в разделе C++, но для начала попробуй просто имплементировать те заготовки которые тебе даст javah. По идее они уже должны содержать декларацию експорта. |
| Автор: AlexeyVorotnikov 24.10.2007, 14:10 |
| Чтобы не мучатся с dll'ками надо использовать функцию RegisterNatives в основной программе. |