obsidian/笔记文件/2.笔记/GetMethodID signature.md
2025-03-26 00:02:56 +08:00

2.5 KiB
Raw Permalink Blame History

#安卓

在 Android 的 JNIJava Native InterfaceGetMethodID 用于获取 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 方法的签名。

签名构建规则

  1. 基本类型(签名中的字符):

    • Zboolean
    • Bbyte
    • Cchar
    • Sshort
    • Iint
    • Jlong
    • Ffloat
    • Ddouble
    • Vvoid
  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;)VintString 参数,无返回值。
    • ([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