Создание JVM из C

Как запустить Java VM из C? Написание кода на C кажется довольно простым - я следовал коду, показанному на p. 84 из "Нативного интерфейса Java" Ляна. Это процесс связывания, который ставит меня в тупик. В этом отношении книга Ляна устарела на 10 с лишним лет, и я не могу найти в сети ничего, что соответствовало бы этой цели (и которая работает).

Чтобы было ясно, я хочу запустить стандартную программу Windows (написанную на C), которая затем запускает JVM и вызывает main() в классе Java (который я написал). Эта программа не должна полагаться на наличие jvm.dll или jvm.lib - пользователю не нужно устанавливать Java для запуска программы. Может быть, это невозможно без чрезмерных усилий.

Среда разработки - MinGW под Windows. Я могу связать таким образом, чтобы программа работала, когда.dll находится в отдельном файле, но не таким образом, чтобы был только один исполняемый файл без каких-либо.dll или.libs.


Оглядываясь назад, теперь я вижу, что это был тупой вопрос или, по крайней мере, тот, который не был продуман. Мораль этой истории заключается в том, что JVM - это не один исполняемый файл или даже исполняемый файл плюс некоторые JAR-файлы; JVM опирается на множество независимо хранимых файлов с различными взаимозависимостями. Разобрать все эти отношения, чтобы их можно было объединить в один файл (или даже в два файла), было бы непросто. Спасибо за стук в голову.

2 ответа

Итак, чтобы быть ясным - вы хотите запустить JVM без необходимости присутствия JVM? Как вы предлагаете достичь этого? Если вы не планируете писать свою собственную реализацию JVM (которая, я бы сказал, подпадает под категорию "неоправданное количество усилий"), разумным требованием является установка JVM. Предполагая, что вы можете просто запустить процесс Java и включить соответствующие параметры командной строки (classpath, класс для запуска и т. Д.).

Отказ от ответственности: я не думаю, что установка среды выполнения Java нецелесообразна для пользователей. Тем не менее, я понимаю ваши мотивы для установки с низким коэффициентом трения для пользователей.

Использование Sun JRE, вероятно, не будет здесь плодотворным. Теоретически, вы можете взять Sun JRE, изменить его для создания статической библиотеки вместо библиотеки DLL и найти способ объединить все ресурсы, связанные с ним (шрифты, изображения, курсоры, сертификаты SSL, локализованные файлы сообщений). и т. д.) в один ресурс, а затем измените среду выполнения для загрузки оттуда. Но это почти наверняка "неоправданное количество усилий".

Вместо этого вы можете захотеть взглянуть на GCJ: его архитектура отличается от Sun JRE, которая больше подходит для встраивания в другое приложение, или может компилировать вашу Java в машинный код.

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

Другие вопросы по тегам