1. 程式人生 > >Android Jni GetMethodID中函式標識的簡單解釋

Android Jni GetMethodID中函式標識的簡單解釋

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的引數類似;