Coins Java - Experiment15

C言語のプログラムからJavaVMを起動する

[Coins Java - Experiment]

目的

作業

"Hello, world!" とだけ表示するプログラムをJavaで書く

$ emacs Hello.java
--- Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
---
$ gcj -c Hello.java

プロパティは空のままで、JvRunMainを呼び出すプログラムを作る。

$ emacs main.c
--- main.c
extern const char **_Jv_Compiler_Properties;
extern void *_ZN5Hello6class$E;

static const char *empty[] = { 0 };

int main (int argc, const char **argv) {
  _Jv_Compiler_Properties = empty;
  JvRunMain (&_ZN5Hello6class$E, argc, argv);
}
---
$ gcc -c main.c

リンクする。本来はldだけで行えるのがベストであるが、今回は実験ということで簡略化。

$ gcc -lgcj main.o Hello.o

結果

以下のようになった。

$ ./a.out
Hello, world!

正しく表示されていることがわかる。

考察

今回のコンパイル方法は、通常のコンパイル方法といくつか異なる点がある。

$ gcj --main=Hello Hello.o -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/specs
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/libgcj.spec
rename spec lib to liborig
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
 --enable-shared --enable-threads=posix --disable-checking --with-system-zlib
 --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.3.2 20031022 (Red Hat Linux 3.3.2-1)
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/jvgenmain Hellomain /tmp/cczZxYXe.i
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/cc1 /tmp/cczZxYXe.i -quiet
 -dumpbase Hellomain.c -g1 -version -fdollars-in-identifiers -o /tmp/cco2D3Uj.s
GNU C version 3.3.2 20031022 (Red Hat Linux 3.3.2-1) (i386-redhat-linux)
        compiled by GNU C version 3.3.2 20031022 (Red Hat Linux 3.3.2-1).
GGC heuristics: --param ggc-min-expand=51 --param ggc-min-heapsize=40045
 as -V -Qy -o /tmp/cctLTibr.o /tmp/cco2D3Uj.s
GNU assembler version 2.14.90.0.6 (i386-redhat-linux) using BFD version 2.14.90.0.6 20030820
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/collect2 --eh-frame-hdr  -m elf_i386
 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crti.o
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
 -L/usr/lib/gcc-lib/i386-redhat-linux/3.3.2
 -L/usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../..
 /tmp/cctLTibr.o Hello.o -lgcc_s -lgcc -lgcj -lm -lpthread -lz -ldl -lgcc_s -lgcc -lc -lgcc_s
 -lgcc /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crtn.o
$ gcc -lgcj main.o Hello.o -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
 --enable-shared --enable-threads=posix --disable-checking --with-system-zlib
 --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.3.2 20031022 (Red Hat Linux 3.3.2-1)
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/collect2 --eh-frame-hdr
 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crti.o
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
 -L/usr/lib/gcc-lib/i386-redhat-linux/3.3.2
 -L/usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../..
 -lgcj main.o Hello.o -lgcc -lgcc_eh -lc -lgcc -lgcc_eh
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crtn.o

必要ならば後ほど調査することにする。

Copyright (C) 2002-2006 s.arakawa