JNI提供了Java和native代码相互交互的接口,当我们在底层访问Java类的域(成员变量)或者方法时,需要提供域或者方法描述符,比如,下面代码,
(*env)->GetFieldID(env, clzz, fieldName, fieldSig);//得到域ID
(*env)->GetFieldID(env, clzz, methodName, methodSig);//得到方法ID
域描述符
签名映射如下,
比如,我们一个int的成员变量,其签名就是I,double的类型就是D,那么String的签名是什么呢?String的包名是java.lang.String,于是其签名是Ljava/lang/String; 如果自定义了一个类,com.example.Person,那么该类的签名就是Lcom/example/Person; 注意,后面有个双引号。另外,数组type[]的签名是[type,比如int[]的签名是[I
方法描述符
方法描述符有两部分组成,参数描述+返回类型描述,该两部分描述均由签名形式给出,格式是 (参数描述)返回类型描述。
比如这个方法的签名是,
public int getInt()
()I ,比较好理解,如果返回类型是空呢,那就用V来表示,
比如,
public void method(String string)
的签名是(Ljava/lang/String;)V
javap获得签名
我们可以使用javap命令来获取域或方法的签名,在eclipse中,我们切换到bin/classes目录,执行,
javap -s com.example.java2struct.TypeSig
结果如下,