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
結果如下,