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 での説明とちょっと違う.......