#安卓
在 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
}
调用参考
![[Pasted image 20241030140702.png]]
classRef:要调用方法的 Java 类的引用(jclass 类型)。"methodName":Java 方法名称。"(signature)ReturnType":Java 方法的签名。基本类型(签名中的字符):
Z:booleanB:byteC:charS:shortI:intJ:longF:floatD:doubleV: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]]