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 | J |
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的参数类似;