Объединение Java и C без gcj - переместить C в Java или Java в C? - PullRequest
2 голосов
/ 03 февраля 2010

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 03 февраля 2010

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


Если у вас есть 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-доступ)
0 голосов
/ 03 февраля 2010

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

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

...