Coins Java - Experiment00

CNIからCの関数を呼び出す

[Coins Java - Experiment]

作業

呼び出す関数のヘッダファイルを作成(CoinsJavaP1.h)

$ emacs CoinsJavaP1.h
--- CoinsJavaP1.h
#ifndef __COINS_JAVA_P1_H
#define __COINS_JAVA_P1_H

extern "C" {
  void langc(int);
}

#endif /* __COINS_JAVA_P1_H */
---

呼び出す関数を実装(CoinsJavaP1.c, void langc(int))

$ emacs CoinsJavaP1.c
--- CoinsJavaP1.c
#include <stdio.h>

void langc(int a) {
  printf("Hello, world! %d\n", a);
}
---
$ gcc -c CoinsJavaP1.c

objdumpを使用して、名前がmangleされていないことを確認(langc)

$ objdump -t CoinsJavaP1.o

CoinsJavaP1.o:     file format elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS*  00000000 CoinsJavaP1.c
00000000 l    d  .text  00000000
00000000 l    d  .data  00000000
00000000 l    d  .bss   00000000
00000000 l    d  .rodata        00000000
00000000 l    d  .note.GNU-stack        00000000
00000000 l    d  .comment       00000000
00000000 g     F .text  0000001b langc
00000000         *UND*  00000000 printf

CNIを呼び出すために、ネイティブメソッドを持ったクラスを作成(Hello.java)

$ emacs Hello.java
--- Hello.java
public class Hello {

    public static void main (String[] args) {
        nativeMethod();
    }

    public static native void nativeMethod();
}
---
$ javac Hello.java

CNIヘッダファイルの自動生成

$ gcjh Hello

ネイティブメソッドを実装(natHello.cc)

$ emacs natHello.cc
--- natHello.cc
#include "Hello.h"
#include "CoinsJavaP1.h"

void Hello::nativeMethod () {
  langc(100);
}
---
$ gcj -c Hello.cc -o natHello.o

呼び出し先関数(langc)をシンボルテーブルに持つか確認

$ objdump -t natHello.o

natHello.o:     file format elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS*  00000000 natHello.cc
00000000 l    d  .text  00000000
00000000 l    d  .data  00000000
00000000 l    d  .bss   00000000
00000000 l    d  .eh_frame      00000000
00000000 l    d  .note.GNU-stack        00000000
00000000 l    d  .comment       00000000
00000000 g     F .text  00000015 _ZN5Hello12nativeMethodEv
00000000         *UND*  00000000 langc
00000000         *UND*  00000000 __gcj_personality_v0

コンパイル

$ gcj --main=Hello Hello.class natHello.o CoinsJavaP1.o

確認し、予想通りの結果になっていた。

$ ./a.out
Hello, world! 100

Copyright (C) 2002-2006 s.arakawa