Я хотел бы знать, можно ли получить аргументы виртуальной машины с помощью JNI?

Использование Invocation API позволяет указать аргументы виртуальной машины, если вы создаете собственную JVM.

Что я хотел бы сделать, так это запросить эти аргументы в JNI из уже работающей JVM, которая была запущена с помощью обычного средства запуска Java. Я считаю, что это должно быть возможно, потому что JMX может это сделать.

Я искал довольно обширно для этого и пока не нашел решения.

Заранее спасибо КНД

PS. Я знаю, что можно запросить их с помощью RuntimeMXBean.getInputArguments(), но мне нужно сделать это изначально в JNI.

0
CND 19 Дек 2011 в 20:37
Вы можете вызвать этот метод из JNI. то есть перезвонить в Java.
 – 
Peter Lawrey
19 Дек 2011 в 20:51
Я знаю, что могу сделать обратный вызов в Java и использовать RuntimeMXBean.getInputArguments(), но, как я предложил в посте, мне нужно сделать это с помощью собственных вызовов, а не путем обратного вызова в Java.
 – 
CND
19 Дек 2011 в 20:56
Можете ли вы сказать, почему? Многие встроенные вызовы JNI делают это, поэтому, если это проблема в вашей системе, у вас, вероятно, будут другие проблемы. Другой вариант - вызвать метод с входными аргументами при загрузке библиотеки, поскольку они не изменятся.
 – 
Peter Lawrey
19 Дек 2011 в 22:36
Потому что приложению необходимо обнаружить определенные входные аргументы и, если они будут найдены, отключить функции приложения. Было бы слишком легко обойти это, изменив RuntimeMXBean.getInputArguments() так, чтобы он возвращал пустой список и перекомпилировал. Поэтому я хочу «подключиться» к нативным функциям для запроса InputArguments. Ненадежный, но немного сложнее «взломать». Надеюсь, это немного прояснит ситуацию? Спасибо, КНД
 – 
CND
19 Дек 2011 в 22:50

1 ответ

RuntimeMXBean.getInputArguments() вызывает VMMangementImpl.getVmArguments, который возвращает неизменяемые коллекции, что затрудняет вмешательство.

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/management/sun/management/VMManagementImpl.java.htm

Он, в свою очередь, вызывает собственный метод getVmArguments0(), и исходный код этого метода доступен в OpenJDK. Возможно, вы сможете вызвать все, что вызывает этот метод.

0
Peter Lawrey 19 Дек 2011 в 23:06