謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

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