Android Jni GetMethodID中函式標識的簡單解釋
阿新 • • 發佈:2019-01-29
1 GetMethodID中函式標識的簡單解釋:
Android 中Jni可以通過FindClass,GetMethodID, CallObjectMethod等可以實現對java中方法的呼叫。
GetMethodID中最後一個引數的寫法很特殊,
Jni中GetMethodID的定義:
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
例如:
char *Jstring2CStr(JNIEnv env, jstring jstr) { char *rtn = NULL; jclass classtring = env.FindClass("java/lang/String"); jstring strencode = env.NewStringUTF("GB2312"); jmethodID mid = env.GetMethodID(classtring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr = (jbyteArray) env.CallObjectMethod(jstr, mid, strencode); jsize alen = env.GetArrayLength(barr); jbyte *ba = env.GetByteArrayElements(barr, JNI_FALSE); if (alen > 0) { rtn = (char *) malloc(alen + 1); memcpy(rtn, ba, alen); rtn[alen] = 0; } env.ReleaseByteArrayElements(barr, ba, 0); return rtn; }
2 含義說明
GetMethodID中sig引數是對函式的簽名,也可以說標識,具體的格式為
(函式引數)返回值
型別符號對照表:
Java型別 |
符號 |
Boolean |
Z |
Byte |
B |
Char |
C |
Short |
S |
Integer |
I |
Long |
L |
Float |
F |
Double |
D |
Void |
V |
Object物件 |
L開頭,包名/類名,”;”結尾,$標識巢狀類 |
陣列 |
[內部型別 |
例子:
public void demo1(int a,int b){} //(II)V public void demo2(String a){} //(Ljava/lang/String;)V public void demo3(String [] arr){}//([Ljava/lang/String;)V public int demo4(){return 0;}//()I public boolean demo5(){return false;} //()Z public String demo6(String [] a){ return "";}//([java/lang/String;)Ljava/lang/String; public String[] demo7(){return null;}//()Ljava/lang/String; public void demo8(String[] a,String[] b){}//([Ljava/lang/String;[Ljava/lang/String;)V public void demo8(String[] a,int b){}//([Ljava/lang/String;I)V public void demo9(int[] a,int b){}//([II)V //內部類 // "(Ljava/lang/String;com/ldx/Demo$DemoInnter;)Z"
其中陣列型別需要說一下,如果是普通型別的陣列不需要加“;”字尾,如果是Object型別的陣列則需要新增”;”
GetFieldID的引數類似;