JNI 调用注意事项详解

需积分: 10 1 下载量 105 浏览量 更新于2024-07-23 收藏 116KB DOC 举报
JNI 调用注意事项 JNI(Java Native Interface)是一种允许Java代码与本地代码进行交互的技术。JNI 方法调用时有一些需要注意的事项,以避免出现不必要的错误。 **基本类型** 在JNI中,Java基本类型及其对应的本地类型如表3-1所示。需要注意的是,Java基本类型在本地代码中的表示方式。 表3-1基本类型和本地等效类型 | Java类型 | 本地类型 | 说明 | | --- | --- | --- | | boolean | jboolean | 无符号,8位 | | byte | jbyte | 无符号,8位 | | char | jchar | 无符号,16位 | | short | jshort | 有符号,16位 | | int | jint | 有符号,32位 | | long | jlong | 有符号,64位 | | float | jfloat | 32位 | | double | jdouble | 64位 | | void | void | N/A | **值类型** 在JNI中,jvalue联合类型用于描述值类型。jvalue类型的声明方式如下: typedef union jvalue { jboolean z; jbyte b; jchar c; jshort s; jint i; jlong j; jfloat f; jdouble d; jobject l; } jvalue; **引用类型** 在JNI中,引用类型用于描述对象的引用。对象的引用可以是局部变量、方法参数或字段等。 **函数命名** 在JNI中,函数命名需要遵守一定的规则。虚拟机将为本地库中的方法查找匹配的方法名。它首先查找短名(没有参数签名的名称),然后再查找带参数签名的长名称。只有当某个本地方法被另一个本地方法重载时,程序员才有必要使用长名。 例如,以下代码中,不必用长名来链接本地方法g,因为另一个方法g不是本地方法,因此它并不在本地库中。 class Cls1 { int g(int i); native int g(double d); } **Unicode字符转换** 在JNI中,Unicode字符需要转换为有效的C函数名。我们采取简单的名字搅乱方案,以保证所有的Unicode字符都能被转换为有效的C函数名。我们用下划线(“_”)字符来代替全限定的类名中的斜杠(“/”)。由于名称或类型描述符从来不会以数字打头,我们用_0、_1、_2、_3来代替转义字符序列,如表2-1所示: 表2-1 Unicode字符转换 | 转义字符序列表示 | | --- | | _0XXXX | Unicode字符XXXX | | _1 | 字符“_” | | _2 | 签名中的字符“;” | | _3 | 签名中的字符“[” | **注意事项** 当native方法有重名时,请写完全限制名区分。此外,c、c++调用代码示例也需要注意。