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的参数类似;
本文详细解析了Android JNI中GetMethodID函数的使用方法及其参数意义,特别是sig参数如何表示Java方法签名,包括基本数据类型、对象及数组类型的表示方式。

695

被折叠的 条评论
为什么被折叠?



