Type Signature

Native Method 中から GetMethodID() を使って Java のメソッドへの参照を得ようとするときは、

    jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");

とするが、その第4引数は Java メソッドの引数と返値を表す。 この例では、引数が "(I)" つまり int であり、返値が "V" つまり void であることを指定している。 その対応表は以下の通り。

Vvoid
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
Lクラス名;クラス名
[タイプタイプ[]
(引数)返値メソッド

例えば、次のような Native Method を定義した場合、

    public native String getWordAt(int i, String text);

その Type Signature は次のようになる。

    (ILjava/lang/String;)Ljava/lang/String;

このような Type Signature を得るには、JDK に付属の javap ツールが利用できる。 例として、次のような Java コードをコンパイルして、javap にかける。

public class TypeTest {
  static {
    System.loadLibrary("type");
  }
  public native String getWordAt(int index, String text);
}
% javac TypeTest.java
% javap -s TypeTest
Compiled from TypeTest.java
public synchronized class TypeTest extends java.lang.Object 
    /* ACC_SUPER bit set */
{
    public native java.lang.String getWordAt(int, java.lang.String);
        /*   (ILjava/lang/String;)Ljava/lang/String;   */
    public TypeTest();
        /*   ()V   */
    static static {};
        /*   ()V   */
}

Java Tutorial での説明とちょっと違う.......