LINUX.ORG.RU

Java и нативный код (помогите пожалуйста !)


0

0

Помогите пожалуйста куда копать и что делать !!!

Вычитал что Java можно компилировать не в байт код виртуальной Java машины а непосредственно в нативный код процессора. Любой ли код можно так скомпилить ? Можно ли скомпилить так уже готовый Java байт код (без сырцов) ???
Захотелось это проделать, взял чужой пример:

xxx@xxx:/tmp/$ cat Temp.java
public class Temp {
public static void main(String args[])
{
System.out.println("Temp");
}
}


xxx@xxx:/tmp/$ gcj Temp.java
gcj: libgcj.spec: No such file or directory

Что это за файл и что туда прописать ?
Сделал: touch /usr/lib/libgcj.spec
Выдает:

xxx@xxx:/tmp/$ gcj Temp.java
/usr/lib/gcc-lib/i486-linux/3.3.5/../../../crt1.o(.text+0x18): In function `_start':
../sysdeps/i386/elf/start.S:98: undefined reference to `main'
/tmp/ccm09cxD.o(.text+0xe): In function `Temp::main(JArray<java::lang::String*>*)':
: undefined reference to `_Jv_InitClass'
/tmp/ccm09cxD.o(.text+0x14): In function `Temp::main(JArray<java::lang::String*>*)':
: undefined reference to `java::lang::System::class$'
/tmp/ccm09cxD.o(.text+0x28): In function `Temp::main(JArray<java::lang::String*>*)':
: undefined reference to `java::lang::System::class$'
/tmp/ccm09cxD.o(.text+0x2d): In function `Temp::main(JArray<java::lang::String*>*)':
: undefined reference to `_Jv_InitClass'
/tmp/ccm09cxD.o(.text+0x37): In function `Temp::main(JArray<java::lang::String*>*)':
: undefined reference to `java::lang::System::out'
/tmp/ccm09cxD.o(.text+0x5f): In function `Temp::Temp[in-charge]()':
: undefined reference to `java::lang::Object::Object[in-charge]()'
/tmp/ccm09cxD.o(.data+0x50): undefined reference to `java::lang::Object::finalize()'
/tmp/ccm09cxD.o(.data+0x54): undefined reference to `java::lang::Object::hashCode()'
/tmp/ccm09cxD.o(.data+0x58): undefined reference to `java::lang::Object::equals(java::lang::Object*)'
/tmp/ccm09cxD.o(.data+0x5c): undefined reference to `java::lang::Object::toString()'
/tmp/ccm09cxD.o(.data+0x60): undefined reference to `java::lang::Object::clone()'
/tmp/ccm09cxD.o(.data+0x80): undefined reference to `vtable for java::lang::Class'
/tmp/ccm09cxD.o(.data+0x94): undefined reference to `java::lang::Object::class$'
/tmp/ccm09cxD.o(.eh_frame+0x11): undefined reference to `__gcj_personality_v0'
collect2: ld returned 1 exit status

anonymous

Вообщем решилось это установкой дополнительного dev пакета.

Как я понял *.java - сырец java, *.class - байт-код java машины,
*.jar - zip архив содержащий кучу *.class

Преобразуем *.java в *.class (получаем Temp.class):
gcj -C Temp.java

Преобразуем *.class в нативный код процессора (ELF executable):
gcj --main=Temp Temp.class -o Temp

Теперь это чудо можно запустить:
xxx:/tmp/# ./Temp
Temp


Вопрос: все ли *.jar (*.class) файлы поддаются перекомпиляции в нативный код ? Возможно есть исключения ?

Есть проект с кучей *.jar пока не удаеться слить все это в нативный бинарник... :(

anonymous
()
Ответ на: комментарий от anonymous

Сам в этом вопросе не разбирался, но еслибы приперло начал бы отсюда:

- Free Java Compilers, Assemblers & Java Development Kits (JDK) (http://www.thefreecountry.com/compilers/java.shtml). Здесь много ссылок на доки в том числе и по нативингу :)

- Boosting Java performance Native code and JIT ciompilers (http://www.disordered.org/Java-JIT.html). Это из названия понятно.

KIV
()

>Любой ли код можно так скомпилить ?

не любой. gcj кое-как держит спецификации 1.2, а про 1.5 я вообще молчу

Reset ★★★★★
()

gcj --main=Temp Temp.java

Reset ★★★★★
()
Ответ на: комментарий от anonymous

>Преобразуем *.java в *.class (получаем Temp.class): >gcj -C Temp.java

лишний шаг

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.