版权声明:本文为博主原创文章,转载希望能注明出处,感谢。 https://blog.csdn.net/u010126792/article/details/82348438
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的参数类似;