2.5 KiB
2.5 KiB
#安卓
在 Android 的 JNI(Java Native Interface)中,GetMethodID
用于获取 Java 方法的 ID,以便在 native 代码中调用该 Java 方法。GetMethodID
需要传入方法的签名(signature),该签名用于指定方法的参数类型和返回类型。
基本的 GetMethodID
语法
C++的相关调用
jmethodID methodID = env->GetMethodID(classRef, "methodName", "(signature)ReturnType");
untiy C#
的相关调用
public static JniMethodID FindMethod(AndroidJavaClass clazz, string name, string signature, bool isStatic)
{
#if UNITY_2022_2_OR_NEWER
var method = AndroidJNIHelper.GetMethodID(clazz.GetRawClass(), name, signature, isStatic);
if (method == IntPtr.Zero)
throw new Exception($"Method {name} with signature {signature} not found");
return method;
#else
return name;
#endif
}
调用参考
classRef
:要调用方法的 Java 类的引用(jclass
类型)。"methodName"
:Java 方法名称。"(signature)ReturnType"
:Java 方法的签名。
签名构建规则
-
基本类型(签名中的字符):
Z
:boolean
B
:byte
C
:char
S
:short
I
:int
J
:long
F
:float
D
:double
V
:void
-
对象类型:用
L
+类的全限定名
+;
,例如Ljava/lang/String;
表示String
对象。 -
数组类型:在基本或对象类型前加
[
。例如,[I
表示int[]
,[Ljava/lang/String;
表示String[]
。 -
方法签名:以括号
()
包括参数类型,并在括号后指定返回类型。例如:()V
:无参数,无返回值。(I)V
:一个int
参数,无返回值。(Ljava/lang/String;)I
:一个String
参数,返回int
。(ILjava/lang/String;)V
:int
和String
参数,无返回值。([I)Ljava/lang/String;
:一个int
数组参数,返回String
。
示例
假设 Java 方法如下:
public int add(int a, int b) { return a + b; }
在 JNI 中获取 add
方法的 ID:
jmethodID methodID = env->GetMethodID(classRef, "add", "(II)I");
add
方法的签名为(II)I
:两个int
参数,返回int
。
正确使用 GetMethodID
能确保在 native 代码中安全地调用 Java 方法。
签名相关,可以参考Android 的 JNI签名Notification