#安卓 在 Android 的 JNI(Java Native Interface)中,`GetMethodID` 用于获取 Java 方法的 ID,以便在 native 代码中调用该 Java 方法。`GetMethodID` 需要传入方法的签名(signature),该签名用于指定方法的参数类型和返回类型。 ### 基本的 `GetMethodID` 语法 C++的相关调用 ``` cpp jmethodID methodID = env->GetMethodID(classRef, "methodName", "(signature)ReturnType"); ``` untiy `C#`的相关调用 ``` cs 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 方法的签名。 ### 签名构建规则 1. **基本类型**(签名中的字符): - `Z`:`boolean` - `B`:`byte` - `C`:`char` - `S`:`short` - `I`:`int` - `J`:`long` - `F`:`float` - `D`:`double` - `V`:`void` 2. **对象类型**:用 `L` + `类的全限定名` + `;`,例如 `Ljava/lang/String;` 表示 `String` 对象。 3. **数组类型**:在基本或对象类型前加 `[`。例如,`[I` 表示 `int[]`,`[Ljava/lang/String;` 表示 `String[]`。 4. **方法签名**:以括号 `()` 包括参数类型,并在括号后指定返回类型。例如: - `()V`:无参数,无返回值。 - `(I)V`:一个 `int` 参数,无返回值。 - `(Ljava/lang/String;)I`:一个 `String` 参数,返回 `int`。 - `(ILjava/lang/String;)V`:`int` 和 `String` 参数,无返回值。 - `([I)Ljava/lang/String;`:一个 `int` 数组参数,返回 `String`。 ### 示例 假设 Java 方法如下: ``` java public int add(int a, int b) { return a + b; } ``` 在 JNI 中获取 `add` 方法的 ID: ``` cpp jmethodID methodID = env->GetMethodID(classRef, "add", "(II)I"); ``` - `add` 方法的签名为 `(II)I`:两个 `int` 参数,返回 `int`。 正确使用 `GetMethodID` 能确保在 native 代码中安全地调用 Java 方法。 签名相关,可以参考[[Android 的 JNI签名Notification]]