2010-02-03 5 views
2

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

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

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

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

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

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

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

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

  1. я должен был бы написать оболочку для оболочки
  2. я бы, вероятно, лучше пропустить эту часть и писать все это в Java
  3. I Ain 't готов к этому, но если я могу просто импортировать классы с тем, что уже существует
  4. Я не понимаю, могу ли я скомпилировать и получить двоичный код в конце, или если я в ловушке Java, время.

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

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

ответ

2

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


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

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

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


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

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

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

  1. Использование JACOB (win32 только: доступ ком)
+0

Если я могу получить GCJ компилируется в моей домашней директории, у меня есть такой огромный декламация. До сих пор я думаю, что что-то упускаю. Он говорит «нет входных файлов», когда я помещаю в 'gcc --bindir = ~/bin --enable-languages ​​= java, c', значит ли это, что мне нужна локальная версия gcc, которую я создаю? Поскольку попытки сделать gcj solo ранее казались непригодными без компиляции gcc с gcc. Дополнительные ссылки приветствуются. – Anthony

+0

@finnw Спасибо. Я никогда не слышал о JACOB. Добавление в ответ – KitsuneYMG

+0

Извините, чтобы напомнить, но просто быстро подтвердите: мне нужно иметь полный gcc tar, прежде чем я смогу скомпилировать gcj в своем домашнем каталоге? – Anthony

0

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

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