Native Method 中から GetMethodID() を使って Java のメソッドへの参照を得ようとするときは、
jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
とするが、その第4引数は Java メソッドの引数と返値を表す。 この例では、引数が "(I)" つまり int であり、返値が "V" つまり void であることを指定している。 その対応表は以下の通り。
V | void |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
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 での説明とちょっと違う.......