Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 будет  smile ?   

Автор: 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 

Конечно лучше через 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
Цитата

вызывает нужные методы твоей Java программы, и наоборот. 

Так как наоборот? Я наверно плохо понимаю как работает 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
Цитата(Eugene128 @  23.10.2007,  20:41 Найти цитируемый пост)
А не подскажете как экспортировать нужные JNI функции?

Это тебе уже лучше спросить в разделе C++, но для начала попробуй просто имплементировать те заготовки которые тебе даст javah. По идее они уже должны содержать декларацию експорта.

Автор: AlexeyVorotnikov 24.10.2007, 14:10
Чтобы не мучатся с dll'ками надо использовать функцию RegisterNatives в основной программе.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)