一、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 方法时抛出的异常。

Android JNI 学习(九):Static Fields Api & Static Methods Api的更多相关文章

  1. Android JNI 学习(四):接口方法表 & Base Api & Exception Api

    本文我们来总结一下JNI 提供的功能列表及相关的函数表. 注意:请注意使用术语“必须”来描述对JNI程序员的限制.例如,当您看到某个JNI函数必须接收非NULL对象时,您有责任确保不将NULL传递给该 ...

  2. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  3. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  5. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  6. Android JNI 学习(一):JNI 简介

    JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...

  7. Android JNI 学习(七):Accessing Fields Api

    一.GetFieldID jfieldIDGetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig); 返回类的实 ...

  8. Android JNI 学习(十一):Invocation Api

    1. 简介 Invocation API允许软件提供商在原生程序中内嵌Java虚拟机.因此可以不需要链接任何Java虚拟机代码来提供Java-enabled的应用程序. 以下代码演示如何使用: #in ...

  9. Android JNI 学习(十):String Operations Api & Other Apis

    一.String Operations(字符串操作) 1. NewString jstring NewString(JNIEnv *env, const jchar *unicodeChars, js ...

随机推荐

  1. Taro button点击切换选中状态

    1.引入组件 2.state中设置选中状态 // button按钮的默认选中,0代表选中 state = { currentIndex: 0 } 3.设置class的样式,点击更改选中 selectN ...

  2. 设计模式之装饰者模式-java实例

    设计模式之装饰者模式 需求场景 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式. 我们已经有了产品,而且这个产品的功能非常 ...

  3. Linux驱动之LCD驱动编写

    在Linux驱动之内核自带的S3C2440的LCD驱动分析这篇博客中已经分析了编写LCD驱动的步骤,接下来就按照这个步骤来字尝试字节编写LCD驱动.用的LCD屏幕为tft屏,每个像素点为16bit.对 ...

  4. Tableau可视化绘图教程

    https://www.w3cschool.cn/tableau/tableau_environment_setup.html

  5. Skipping acquire of configured file ···doesn't support architecture 'i386' acquire of configured file

    系统更新的时候报错: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'http://rep ...

  6. douyin-bot-代码

    # -*- coding: utf-8 -*- import sys import random import time from PIL import Image if sys.version_in ...

  7. mr微博内容推荐

        第一次迭代 1 package com.laoxiao.mr.weibo; import java.io.StringReader; import org.apache.commons.lan ...

  8. Java 调用执行其他语言的程序

    以 Java 调用 Python 为例 1. 使用 Runtime 类 该方式简单,但是增加了 Java 对python 的依赖,需要事先安装python,及python程序依赖的第三方库 Runti ...

  9. 服务管理之httpd

    目录 1. httpd简介 2. httpd版本 2.2 httpd-2.4新增的模块 3. httpd基础 3.1 httpd自带的工具程序 3.2 rpm包安装的httpd程序环境 3.3 web ...

  10. C#替换文件中特定字符串,按照原来的编码格式保存

    private void button1_Click(object sender, EventArgs e) { var txt1 = "E:\\Temp\\local"; str ...