在JNI中,当我们使用GetFieldID/GetStaticFieldID或GetMethodID/GetStaticMethodID及定义JNINativeMethod等时,我们需要表示成员变量的类型,或函数传入参数或返回的类型。JNI把Field的类型,或函数传入参数或返回值的类型进行简写以char*的形式进行表示。
对于成员变量,直接用java类型的简写表示成员变量的类型就可以
比如:"I"表示该成员变量是Int类型
"Ljava/lang/String;
"表示该成员变量是String类型
示例1:
jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;
");
jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");
对于成员函数,是以"(*)+"形式表示函数的有哪些传入参数,传入参数的类型,返回值的类型。"()" 中的字符表示传入参数,后面的则代表返回值。
例如:
"()V" 就表示void Func();
"(II)V" 表示 void Func(int, int);
"(Ljava/lang/String;
Ljava/lang/String;
)I".表示 int Func(String,String)
示例2:
static JNINativeMethod gPowerManagerServiceMethods[] = {
/* name, signature, funcPtr */
{ "nativeInit", "()V",
(void*) android_server_PowerManagerService_nativeInit },
{ "nativeSetPowerState", "(ZZ)V",
(void*) android_server_PowerManagerService_nativeSetPowerState },
{ "nativeStartSurfaceFlingerAnimation", "(I)V",
(void*) android_server_PowerManagerService_nativeStartSurfaceFlingerAnimation },
};
关于类型简写,首先请参照下表。
表A
[table]
|Java 类型|符号|
| Boolean |Z|
| Byte |B|
| Char |C|
| Short |S|
| Int |I|
| Long |L|
| Float |F|
| Double |D|
| Void |V|
| objects对象 |以"L"开头,以";
"结尾,中间是用"/" 隔开的包及类名。
比如:Ljava/lang/String;
如果是嵌套类,则用$来表示嵌套。
例如 "(Ljava/lang/String;
Landroid/os/FileUtils$FileStatus;
)Z"|
[/table]
另外数组类型的简写,则用"["加上如表A所示的对应类型的简写形式进行表示就可以了,
比如:[I表示 int [];
[L/java/lang/objects;
表示Objects[],另外。引用类型(除基本类型的数组外)的标示最后都有个";
"
android职业交流QQ 群,有兴趣的可以一起来多搞搞技术、职业交流,互相学习、提高,互通好的职业信息,群号:104286694