gcjのCNIを使ったD言語とJavaとの連携メモ
名前空間はstatic struct使えばおk。ただし、gdcはmangling規則がおかしいのでdmdじゃなきゃだめ。修理された
extern(C++) static struct java{ static struct lang{ static struct Math{ static int abs(int); } } }
えーと…libgcj.aが無い件。-lgcjはできるんだけど、nm libgcj.so.*としてもシンボルが無い。*.jar使ってそうだけど中身はclassで、多分*.oにコンパイルしてリンクするのが多分正しい道。
戻り値の型はmangleに含まれないのでまずはC++ヘッダを作る。
mkdir libgcj-4.1&&cd libgcj-4.1 unzip /usr/share/java/libgcj-4.1.jar cd .. gcjh -cni -all libgcj-4.1/ #rm -r libgcj-4.1
んでコンパイルのために
gcj /usr/share/java/libgcj-4.1.jar
としたらメモリ食い尽くす…orz。
仕方なく必要なのだけ分割コンパイルで
cd libgcj-4.1 gcj -c java/*.class java/*/*.class java/*/*/*/.class java/*/*/*/*.class java/*/*/*/*/*.class java/*/*/*/*/*/*.class
として…ファイル数多っ。さすがjavaというか。
んで
cd .. dmd -c test.d gcj-4.1 -lphobos2 test.o libgcj-4.1/*.o
としてみた。幾つかエラーがあるが、マングルが不一致な件から。どうもabsの引数の型がint(i)じゃなくてjint(Jii)だからっぽい。どうも戻り値の型のマングルが含まれているからのようだ。
/usr/include/c++/4.1/gcj/javaprims.hを見たら
extern "Java" { typedef __java_byte jbyte; typedef __java_short jshort; typedef __java_int jint; typedef __java_long jlong; typedef __java_float jfloat; typedef __java_double jdouble; typedef __java_char jchar; typedef __java_boolean jboolean; typedef jint jsize; (ry
てなことになってる…orz。こりゃdmd側の改造必須。
その他にも"hidden alias for (ry"なエラーが大量に。
詰んだ。
勘違い。"J戻り値のmangle"が追加されているだけの模様。
mangleの問題を解決するパッチ書いた。リンクを再度試したいけど、libgcjのコンパイルが億劫。
http://bazaar.launchpad.net/~lovesyao/dex/gdc-dex/revision/175