Объединение Java и C без gcj - переместить C на Java или Java на C?

Во-первых, у меня нет опыта в этом. Но, как и в начале любой хорошей программы, у меня есть проблема, которую я должен решить, поэтому я готов учиться.

Многие из вас, вероятно, уже знакомы с pdftk, удобной утилитой для обработки различных задач, связанных с PDF. Насколько я могу судить, большинство этих функций доступно в гораздо более новых, более легких библиотеках / расширениях, кроме той, которая мне нужна (и, вероятно, единственная причина, по которой она все еще существует): объединение файлов данных форм (fdf и xfdf) с формой PDF и получение нового файла в качестве вывода.

Проблема в том, что на моем сервере нет gcj, что является фундаментом для сборки / компиляции pdftk. Я не знаю, потому что я нахожусь на Солярисе или по какой-то другой причине уровня системного администратора, но я не получаю gcj в ближайшее время. Насколько я могу найти, для Solaris нет предварительно скомпилированных двоичных файлов.

Поэтому я думаю, что файл MAKE и код C можно переписать, чтобы импортировать библиотеку Java (очень древнюю версию itext) напрямую через javac.

Но я не уверен, с чего начать. Все, что я знаю, это:

  1. Я хочу двоичный файл, когда я закончу, чтобы не было необходимости в Java VM при каждом использовании.
  2. Текущее приложение использует GCJ.

Поэтому моей первой мыслью было: "О, это легко, я могу, вероятно, просто вызвать классы с помощью другого метода на основе Си", но вместо того, чтобы найти простой метод для этого, я нахожу тонны длинных постов под разными углами. что к этому можно подойти и т. д.

Затем я нашел страницу на сайте Sun о том, как называть другие языки (например, C) в классе Java. Но проблемы с этим подходом:

  1. Я должен был бы написать обертку для обертки
  2. Возможно, мне лучше пропустить эту часть и написать все это на Java
  3. Я еще не готов к этому, если я могу просто импортировать классы с тем, что уже есть
  4. Я не уверен, смогу ли я скомпилировать и получить двоичный файл в конце, или я пойман в ловушку в Java, которая необходима каждый раз.

Я еще раз прошу прощения за свое невежество. Мне просто нужно несколько советов и примеров того, как можно заменить GCJ-зависимый C-код чем-то, что работает непосредственно с Java.

И, конечно, если я задаю один из тех вопросов типа "если бы мы могли сделать это, мы уже были бы богаты", дайте мне знать.

2 ответа

Решение

Я не уверен, что именно вы ищете, поэтому я дал несколько ответов.


Если у вас есть Java-код, который нужно запустить, вы должны:

  1. Запустите его в JVM. Вы можете запустить этот vm в своем собственном c-коде, но он все еще использует jvm
  2. Перепишите его на другом языке.
  3. Компиляция с опережающим компилятором (например, gcj)

Кстати, вы можете скомпилировать копию gcj в вашей домашней папке и использовать ее. Я считаю, что магический переключатель --enable-languages=java,c (см.: здесь для более)


Если у вас есть c-код, который вы хотите вызвать из java, у вас есть четыре варианта:

  1. Собственный интерфейс Java (JNI). Кажется, вы нашли это
  2. Собственный доступ Java (JNA). Это медленнее, чем JNI, но требует меньшего количества кодирования и не содержит C-кода-оболочки. Это требует банку и библиотеку
  3. Создайте утилиту CLI и используйте Runtime.Exec(...) для ее вызова.
  4. Используйте какой-то тип межпроцессного взаимодействия, чтобы Java-код попросил c-код выполнить операцию и вернуть результат.

Дополнительные платформо-зависимые опции

  1. Используйте JACOB (только для win32: com-доступ)

Я не уверен, что понимаю, что вы ищете.

Если вы хотите внедрить код C в Java для создания собственного двоичного файла без gcj, я думаю, вам не повезло. Вы можете включить C в Java, но это будет в основном Java-программа, а это значит, что вам потребуется JVM при каждом запуске. Есть ли что-то, что мешает вам составить gcj самостоятельно?

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