2010-05-08 4 views
1

Я пытаюсь создать исполняемый файл под платформой Windows для Java-программы, используя JNI, C/C++ и API-интерфейс, я уже создал файл jar для моей программы, который включает все зависимости. Я хочу встроить его в exe-файл, мне удалось запустить простой основной класс (присутствующий в файловой системе) с использованием API-интерфейса JNI, я планирую добавить файл jar в качестве ресурса в программу C/C++. Но я не знаю, как запустить этот файл jar. Один вариант - создать временный файл jar в файловой системе и запустить его с помощью java. Но я не хочу раскрывать свой файл jar всем по соображениям безопасности. Как я могу запустить jar файл на лету, используя JNI?Создание java-исполняемого файла с использованием JNI?

+1

«Я не хочу раскрывать свой файл jar для всех по соображениям безопасности». Поместив его в exe и отправив exe кому-то, вы разоблачаете его. –

+0

Да, но exe не может быть декомпилирован так легко, как bytecode – Xinus

+2

Но если вы просто упаковываете JAR-файл внутри .exe, для его устранения не требуется «декомпиляция». – Nate

ответ

2

Компиляция Java с исполняемым файлом с GCJ не работает все время, существуют ограничения в отношении использования отражения и других элементов, таких как классы пользовательского интерфейса, Look at this page.

Если вы конвертируете Java-код в библиотеку или просто другой модуль, вы можете ссылаться на него и просто запускать его без использования JVM.

+0

Отражение должно отлично работать со стратегией, которую проводит ОП. –

+0

@ Kevin Day - Думаю, ты поманил меня за то, что положил туда отражение. Вы не следовали моей ссылке, чтобы указать на GCJ. Я отредактировал мой пост, чтобы сделать его более явным :( –

+0

Ярмарка «Ну, подумайте, что динг отменил ;-) –

1

Моя первоначальная реакция заключалась в том, что я был бы шокирован, если бы вы могли заставить это работать, и чтобы оно было исполнено. Но потом я начал об этом думать, и, возможно, вы могли бы это сделать, используя специальный загрузчик классов. Если вы вставляете jar в exe в качестве ресурса, это будет точно так же, как наличие байтов jar в определенном смещении в любом файле (независимо от exe или нет).

Итак, вот потенциальная стратегия: реализовать пользовательский загрузчик классов, который принимает путь exe и смещение ресурса jar в этом файле. Это будет использовать пользовательскую версию ZipFile, которая использует фиксированное смещение индекса для своих чтений (к сожалению, не будет возможности использовать сам ZipFile, но если вы захватите источник ZipFile, это будет довольно очевидно, где вы будете необходимо добавить смещение).

Проблема с загрузкой здесь (как загрузить пользовательский загрузчик классов?) - но я думаю, что это возможно сделать со стороны JNI. В основном вы должны хранить файл .class для загрузчика в качестве отдельного ресурса в exe, полностью загружать его в память, а затем конструировать с помощью вызовов JNI. Это будет хлопот, но это просто для одного класса, а затем вы можете позволить Java runtime взять на себя все остальное.

Звучит как интересный проект (хотя, как указывают другие, в том, что вы делаете, не так много безопасности ... Я полагаю, что вы можете зашифровать встроенную банку и добавить код расшифровки в загрузчик классов, но вы должны решить, как далеко вы хотите это сделать).

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