zoukankan      html  css  js  c++  java
  • Android JNI 学习(八):Calling Instance Methods Api

     一、GetMethodID

    jmethodIDGetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

    返回类或接口实例(非静态)方法的方法 ID。方法可在某个 clazz 的超类中定义,也可从 clazz继承。该方法由其名称和签名决定。

    GetMethodID() 可使未初始化的类初始化。

    要获得构造函数的方法 ID,应将 <init> 作为方法名,同时将 void (V) 作为返回类型。

    参数:

    env:JNI 接口指针。

    clazz:Java 类对象。

    name:0 终结的 UTF-8 字符串中的方法名。

    sig:0 终结的 UTF-8 字符串中的方法签名。

    返回值:

    方法 ID,如果找不到指定的方法,则为 NULL

    抛出:

    NoSuchMethodError:如果找不到指定方法。

    ExceptionInInitializerError:如果由于异常而导致类初始化程序失败。

    OutOfMemoryError:如果系统内存不足。

    二、Call<type>Method Routines

    Call<type>MethodA Routines

    Call<type>MethodV Routines

    NativeType Call<type>Method(JNIEnv *env, jobject obj, jmethodID methodID, ...);
    NativeType Call<type>MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
    NativeType Call<type>MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args);

    这三个操作的方法用于从本地方法调用Java 实例方法。它们的差别仅在于向其所调用的方法传递参数时所用的机制。

    这三个操作将根据所指定的方法 ID 调用 Java 对象的实例(非静态)方法参数 methodID 必须通过调用 GetMethodID() 来获得。

    当这些函数用于调用私有方法和构造函数时,方法 ID 必须从 obj 的真实类派生而来,而不应从其某个超类派生。

    Call<type>Method Routines

    编程人员应将要传给方法的所有参数紧跟着放在 methodID 参数之后。Call<type>Method routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。

    Call<type>MethodA Routines

    编程人员应将要传给方法的所有参数放在紧跟在 methodID 参数之后的 jvalues 类型数组 args 中。Call<type>MethodA routine 接受这些数组中的参数并将其传给编程人员所要调用的 Java 方法。

    Call<type>MethodV Routines

    编程人员将方法的所有参数放在紧跟着在 methodID 参数之后的 va_list 类型参数变量中。Call<type>MethodV routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。

    下表根据结果类型说明了各个方法调用例程。用户应将Call<type>Method 中的 type 替换为所调用方法的 Java 类型(或使用表中的实际方法调用例程名),同时将 NativeType 替换为该例程相应的本地类型。 

    Call<type>Method Routines 名

    本地类型

    CallVoidMethod() CallVoidMethodA() CallVoidMethodV()

    void

    CallObjectMethod() CallObjectMethodA() CallObjectMethodV()

    jobject

    CallBooleanMethod() CallBooleanMethodA() CallBooleanMethodV()

    jboolean

    CallByteMethod() CallByteMethodA() CallByteMethodV()

    jbyte

    CallCharMethod() CallCharMethodA() CallCharMethodV()

    jchar

    CallShortMethod() CallShortMethodA() CallShortMethodV()

    jshort

    CallIntMethod() CallIntMethodA() CallIntMethodV()

    jint

    CallLongMethod() CallLongMethodA() CallLongMethodV()

    jlong

    CallFloatMethod() CallFloatMethodA() CallFloatMethodV()

    jfloat

    CallDoubleMethod() CallDoubleMethodA() CallDoubleMethodV()

    jdouble

    参数:

    env:JNI 接口指针。

    obj:Java 对象。

    methodID:方法 ID。

    Call<type>Method Routines的其它参数:

    要传给 Java 方法的参数。

    Call<type>MethodA Routines的其它参数:

    args:参数数组。

    Call<type>MethodV Routines的其它参数:

    args:参数的 va_list。

    返回值:

    返回调用 Java 方法的结果。

    抛出:

    执行 Java 方法时抛出的异常。

    三、CallNonvirtual<type>Method Routines

    CallNonvirtual<type>MethodA Routines

    CallNonvirtual<type>MethodV Routines

    NativeType CallNonvirtual<type>Method(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
    NativeType CallNonvirtual<type>MethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, const jvalue *args);
    NativeType CallNonvirtual<type>MethodV(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args); 

    这些操作根据指定的类和方法 ID 调用某 Java 对象的实例(非静态)方法。参数 methodID 必须通过调用 clazz 类的GetMethodID() 获得。

    CallNonvirtual<type>Method 和 Call<type>Method 例程系列并不相同。Call<type>Method 例程根据对象的类调用方法,而 CallNonvirtual<type>Method 例程则根据获得方法 ID 的(由 clazz 参数指定)类调用方法。方法 ID 必须从对象的真实类或其某个超类获得。

    CallNonvirtual<type>Method Routines

    编程人员应将要传给方法的所有参数紧跟着放在 methodID 参数之后。CallNonvirtual<type>Method routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。

    CallNonvirtual<type>MethodA Routines

    编程人员应将要传给方法的所有参数放在紧跟在 methodID 参数之后的 jvalues 类型数组 args 中。CallNonvirtual<type>MethodAroutine 接受这些数组中的参数并将其传给编程人员所要调用的 Java 方法。

    CallNonvirtual<type>MethodV Routines

    编程人员应将要传给方法的所有参数放在紧跟在 methodID 参数之后的 va_list 类型参数 args 中。CallNonvirtualMethodV routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。

    下表根据结果类型说明了各个方法调用例程。用户应将CallNonvirtual<type>Method 中的 type 替换为所调用方法的 Java 类型(或使用表中的实际方法调用例程名),同时将 NativeType 替换为该例程相应的本地类型。

    CallNonvirtual<type>Method Routines名

    本地类型

    CallNonvirtualVoidMethod() CallNonvirtualVoidMethodA() CallNonvirtualVoidMethodV()

    void

    CallNonvirtualObjectMethod() CallNonvirtualObjectMethodA() CallNonvirtualObjectMethodV()

    jobject

    CallNonvirtualBooleanMethod() CallNonvirtualBooleanMethodA() CallNonvirtualBooleanMethodV()

    jboolean

    CallNonvirtualByteMethod() CallNonvirtualByteMethodA() CallNonvirtualByteMethodV()

    jbyte

    CallNonvirtualCharMethod() CallNonvirtualCharMethodA() CallNonvirtualCharMethodV()

    jchar

    CallNonvirtualShortMethod() CallNonvirtualShortMethodA() CallNonvirtualShortMethodV()

    jshort

    CallNonvirtualIntMethod() CallNonvirtualIntMethodA() CallNonvirtualIntMethodV()

    jint

    CallNonvirtualLongMethod() CallNonvirtualLongMethodA() CallNonvirtualLongMethodV()

    jlong

    CallNonvirtualFloatMethod() CallNonvirtualFloatMethodA() CallNonvirtualFloatMethodV()

    jfloat

    CallNonvirtualDoubleMethod() CallNonvirtualDoubleMethodA() CallNonvirtualDoubleMethodV()

    jdouble


    参数:

    env:JNI 接口指针。

    clazz:Java 类。

    obj: Java 对象。

    methodID:方法 ID。

    CallNonvirtual<type>Method Routines的其它参数:

    要传给 Java 方法的参数。

    CallNonvirtual<type>MethodA Routines的其它参数:

    args:参数数组。

    CallNonvirtual<type>MethodV Routines的其它参数:

    args:参数的 va_list

    返回值:

    调用 Java 方法的结果。

    抛出:

    执行 Java 方法时所抛出的异常。

     

     

  • 相关阅读:
    清空
    从一个例子看现代C++的威力
    C++11实现一个自动注册的工厂
    REST RPC架构思想
    thinking in object pool
    worksteal thread pool
    check member function
    C# string 常用功能的方法扩展
    C#设计模式总结
    JAVA过滤器和拦截器的区别
  • 原文地址:https://www.cnblogs.com/renhui/p/9986164.html
Copyright © 2011-2022 走看看