一、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. 重温IO

    IO就是输入输出,输出流可以理解为向目标写入数据,输入流可以理解为从源地址读取.流是一组有序的数据序列.   输入流 输出流 字节流 InputStream OutputStream 字符流 Read ...

  2. ARM汇编指令格式

    一.ARM介绍 1) arm汇编中,程序下一步执行哪一条指令,是根据程序计数器(PC)的值来决定. 类比于8086的CS:IP的功能. 2) 8086属于CISC(复杂指令集),每条指令长度不等,ar ...

  3. kivy sdl2 - ImportError: DLL load failed: 找不到指定的模块。

    kivy version : windows:win python version:3.6 sdl2 - ImportError: DLL load failed: 找不到指定的模块. 运行以下dem ...

  4. Python爬虫——Request模块

    # 使用 Requests 发送网络请求# 1.导入 Requests 模块import requests# 2.尝试获取某个网页 # HTTP 请求类型r = requests.get('https ...

  5. MUI 添加自定义图标(注意点)

    参考: https://blog.csdn.net/qq_39759115/article/details/79436606 注意: 1. 将这个原来的逗号改成分号 2. 这些图标的名字都可以改名字

  6. 如何配置nginx屏蔽恶意域名解析指向《包含隐藏nginx版本号》

    恶意域名指向: 比如,有一个垃圾域名将解析指向到了你们服务器的IP,一般多一个解析可能不会有什么问题,但是现在全民备案时期,可能你的运营商会联系你,说你们的域名没备案,可能会封你们的80端口,然后会导 ...

  7. HTML 中使用 JavaScript

    在 HTML 中插入 JavaScript 的主要方法,就是使用 <script> 元素, 浏览器会解释并执行其中的 JavaScript 代码. <script>  元素的属 ...

  8. dubbo服务达成jar包

    <build> <finalName>dubbo-provider</finalName> <!-- jar包名,一般设置为提供者服务名 --> < ...

  9. OO第二单元多线程电梯总结

    OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...

  10. HttpWebRequest.AddRange 支持long类型

    很久很久以前,在哪个FAT32格式还流行的年代,文件大小普遍还没超过4G的年代,.Net已经出来了. 而那时候.Net实现的HTTP断点续传协议,还没预料到如此普及(我猜的).那时候的HttpWebR ...