Объектный код компилятора Java (байт-код?) - PullRequest
3 голосов
/ 15 марта 2012

Типичная программа на С будет скомпилирована, собрана, связана и загружена. Я знаю, что Java работает с JVM и производит байт-код. Можно ли было соединить оба «объектных файла» с помощью компоновщика? Например, программу на C и программу на C ++ можно использовать вместе, играя с компоновщиком и связывая оба объектных файла.

Можно ли сделать то же самое между C и Java?

Ответы [ 4 ]

5 голосов
/ 15 марта 2012

Вы не можете напрямую связать скомпилированный код C с скомпилированным кодом Java.

Вы можете вызывать скомпилированный код C или C ++ из Java, используя собственный интерфейс Java (JNI) :

Собственный интерфейс Java (JNI) позволяет интегрировать код, написанный на языке программирования Java, с кодом, написанным на других языках, таких как C и C ++.Это позволяет программистам в полной мере использовать преимущества платформы Java, не отказываясь от своих вложений в унаследованный код.

3 голосов
/ 15 марта 2012

Это может быть возможно, если вы компилируете код C в байт-код JVM, а не в собственный код, поэтому вы должны «ссылаться» на уровне JVM, а не через собственный компоновщик объектов.

См. http://en.wikipedia.org/wiki/Java_virtual_machine#C_to_bytecode_compilers

2 голосов
/ 15 марта 2012

Нет, по крайней мере, не с помощью каких-либо общих инструментов. «Объектный файл», который javac создает (неофициально), называется «байт-кодом» и является аппаратно-независимым представлением программы для стекового компьютера (не сильно отличается от того, что использовалось для старого «P-кода» системы).

Существуют различные инструменты, которые могут преобразовывать байт-коды Java в исполняемые файлы для различных аппаратных архитектур, но все они довольно специализированы - ни один из тех, что я знаю об этом, производит связываемые модули.

1 голос
/ 15 марта 2012

GCC может компилировать Java в файлы классов, а затем в исполняемый код ассемблера , используя gcj

AFAIK, бесполезно объединять Java и C напрямую, но машинный код должен в конечном итоге быть в форме, понятной обычному компоновщику. Вам, вероятно, понадобится код клея на ассемблере для вызова между ними.

...