2010-01-04 3 views
4

Я делаю lib так, чтобы приложения cpp могли общаться с JVM. Предположим, что JVM уже начал, как я могу связать двоичный файл cpp с JVM? Я считаю, что лучшим решением является сохранение JVI env-переменной в общем объекте (так), поэтому я могу включить его в cpp и использовать позже.Могу ли я хранить переменную Java Env JNI?

Возможно ли это?

EDIT ----

Я хочу, чтобы получить JavaVM интерфейс за пределами виртуальной машины Java, что-то вроде этого метода:

  • GetJavaVM возвращает указатель на интерфейс JavaVM для текущего экземпляра виртуальной машины.

ответ

2

Ваш вопрос непонятен: похоже, что вы хотите, чтобы приложение C++ связывалось с JVM, работающим как отдельный процесс. В этом случае вам нужно использовать некоторую форму межпроцессного взаимодействия, такую ​​как трубы, сокеты, CORBA, что угодно. Указатель JNIEnv, как и все указатели, действителен только в том процессе, в котором он используется.

Единственный случай, который, как мне кажется, подходит вашему вопросу: если вы запустите программу Java, вызовите метод native, то этот собственный метод запускает отдельные потоки. В этом случае нет, вы не можете делиться указателем JNIEnv, потому что он привязан к потоку. Однако вы можете использовать JNI invocation API для доступа к виртуальной машине Java из потока C++.

+0

Это то, что я хочу, у меня есть 2 процесса с JVM с родным lib, который будет хранить указатель, а другой - только C++-код, который будет использовать эту lib. Я хочу, чтобы другой процесс (только на C++) использовал lib и вызывал jvm (другой процесс). –

+0

Если это не ясно из моего сообщения, вы не можете этого сделать. – kdgregory

+0

Я думаю, возможно, возможно сделать метод 'connect' в родном lib, чтобы сделать следующее: * Вернуть указатель JavaVM с GetJavaVM() Теперь вызовите AttachCurrentThread() с этим указателем JavaVM. Мой вопрос: если это возможно, поскольку они не разделены нитями, а процессом :( –

0

Нет, я так не думаю. JVM получает среду во время ее запуска и не может быть изменена из внешнего процесса во время выполнения программы.

Стандартная процедура в эти дни предназначена для связи программ с использованием TCP/IP и сокетов. Для простого и дешевого решения вы можете рассмотреть возможность использования файлов в каталоге (хотя, конечно, с этим проблемы производительности и параллелизма).


Я только что заметил заявление «Я делаю lib». Если ваша библиотека предназначена для «публичного» потребления, она должна быть кросс-платформенной, и тогда я думаю, что сокет-ввод-вывод будет иметь смысл делать.

Возможно, вы можете захватить JMX, чтобы делать то, о чем вы просите, но я не очень хорошо разбираюсь в этом.

0

Сколько процессов вы здесь? Если это все внутри одного процесса, тогда ответ «да». C++ может вызывать API GetEnv от jni.h.

+0

It's 2 process :( –

+0

Время создания веб-службы на Java, с которой можно разговаривать с C++? – bmargulies

Смежные вопросы