zoukankan      html  css  js  c++  java
  • Android JNI 学习(九):Static Fields Api & Static Methods Api

     一、Accessing Static Fields(访问静态域) 

    1. GetStaticFieldID

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

    返回类的静态域的域 ID。域由其名称和签名指定。GetStatic<type>Field 和 SetStatic<type>Field 访问器函数系列使用域 ID 检索静态域。

    GetStaticFieldID() 将未初始化的类初始化。

    参数:

    env:JNI 接口指针。

    clazz:Java 类对象。

    name: 0 终结的 UTF-8 字符串中的静态域名。 

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

    返回值:

    域 ID。如果找不到指定的静态域,则为 NULL

    抛出:

    NoSuchFieldError:如果找不到指定的静态域。

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

    OutOfMemoryError:如果系统内存不足。

    2. GetStatic<type>Field Routines

    NativeTypeGetStatic<type>Field(JNIEnv*env, jclass clazz, jfieldID fieldID);

    该访问器 Routines系列返回对象的静态域的值。要访问的域由通过调用GetStaticFieldID()而得到的域 ID 指定。

    下表说明了 GetStatic<type>Field Routines名及结果类型。应将 GetStatic<type>Field 中的 type 替换为域的 Java 类型(或使用表中的某个实际 Routines名),然后将NativeType 替换为该 Routines对应的本地类型。

    GetStatic<type>Field Routines名

    本地类型

    GetStaticObjectField()

    jobject

    GetStaticBooleanField()

    jboolean

    GetStaticByteField()

    jbyte

    GetStaticCharField()

    jchar

    GetStaticShortField()

    jshort

    GetStaticIntField()

    jint

    GetStaticLongField()

    jlong

    GetStaticFloatField()

    jfloat

    GetStaticDoubleField()

    jdouble

    参数:

    env:JNI 接口指针。

    clazz:Java 类对象。

    fieldID:静态域 ID。

    返回值:

    静态域的内容。

    3. SetStatic<type>Field Routines

    voidSetStatic<type>Field(JNIEnv *env, jclass clazz, jfieldID fieldID, NativeType value);

    该访问器 Routines系列设置对象的静态域的值。要访问的域由通过调用GetStaticFieldID()而得到的域 ID 指定。

    下表说明了 SetStatic<type>Field Routines名及结果类型。应将 SetStatic<type>Field 中的 type 替换为域的 Java 类型(或使用表中的某个实际 Routines名),然后将NativeType 替换为该 Routines对应的本地类型。

    SetStatic<type>Field Routines名

    本地类型

    SetStaticObjectField()

    jobject

    SetStaticBooleanField()

    jboolean

    SetStaticByteField()

    jbyte

    SetStaticCharField()

    jchar

    SetStaticShortField()

    jshort

    SetStaticIntField()

    jint

    SetStaticLongField()

    jlong

    SetStaticFloatField()

    jfloat

    SetStaticDoubleField()

    jdouble

    参数:

    env:JNI 接口指针。

    clazz:Java 类对象。

    fieldID:静态域 ID。

    value:域的新值。

    二、调用静态方法

    1. GetStaticMethodID

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

    返回类的静态方法的方法 ID。方法由其名称和签名指定。

    GetStaticMethodID() 将未初始化的类初始化。

    参数:

    env:JNI 接口指针。

    clazz:Java 类对象。

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

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

    返回值:

    方法 ID,如果操作失败,则为 NULL

    抛出:

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

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

    OutOfMemoryError:如果系统内存不足。

    2. CallStatic<type>Method Routines、CallStatic<type>MethodA Routines、CallStatic<type>MethodV Routines

    NativeTypeCallStatic<type>Method(JNIEnv*env, jclass clazz, jmethodID methodID, ...);
    NativeTypeCallStatic<type>MethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
    NativeTypeCallStatic<type>MethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);

    这些操作将根据指定的方法 ID 调用 Java 对象的静态方法。methodID 参数必须通过调用GetStaticMethodID() 得到。

    方法 ID 必须从 clazz 派生,而不能从其超类派生。

    CallStatic<type>Method Routines

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

    CallStatic<type>MethodA Routines

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

    CallStatic<type>MethodV Routines

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

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

    CallStatic<type>Method Routines名

    本地类型

    CallStaticVoidMethod() CallStaticVoidMethodA() CallStaticVoidMethodV()

    void

    CallStaticObjectMethod() CallStaticObjectMethodA() CallStaticObjectMethodV()

    jobject

    CallStaticBooleanMethod() CallStaticBooleanMethodA() CallStaticBooleanMethodV()

    jboolean

    CallStaticByteMethod() CallStaticByteMethodA() CallStaticByteMethodV()

    jbyte

    CallStaticCharMethod() CallStaticCharMethodA() CallStaticCharMethodV()

    jchar

    CallStaticShortMethod() CallStaticShortMethodA() CallStaticShortMethodV()

    jshort

    CallStaticIntMethod() CallStaticIntMethodA() CallStaticIntMethodV()

    jint

    CallStaticLongMethod() CallStaticLongMethodA() CallStaticLongMethodV()

    jlong

    CallStaticFloatMethod() CallStaticFloatMethodA() CallStaticFloatMethodV()

    jfloat

    CallStaticDoubleMethod() CallStaticDoubleMethodA() CallStaticDoubleMethodV()

    jdouble

    参数:

    env:JNI 接口指针。

    clazz:Java 类对象。

    methodID:静态方法 ID。

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

    要传给静态方法的参数。

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

    args:参数数组。

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

    args:参数的 va_list

    返回值:

    返回调用静态 Java 方法的结果。

    抛出:

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

  • 相关阅读:
    [solution]xdebug正确配置,但不显示错误信息
    SIGCHLD信号
    sigsuspend
    信号引起的竞态
    智力面试题
    可重入和不可重入
    信号—信号处理函数(捕捉)
    PCB信号集
    信号产生的原因:
    信号初步
  • 原文地址:https://www.cnblogs.com/renhui/p/9986271.html
Copyright © 2011-2022 走看看