Android JNI 学习:Static Fields Api & Static Methods Api
Posted 灰色飘零
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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对应的本地类型。
参数:
env:JNI 接口指针。
返回值:
静态域的内容。
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对应的本地类型。
参数:
env:JNI 接口指针。
clazz:Java 类对象。
二、调用静态方法
1. GetStaticMethodID
jmethodIDGetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
GetStaticMethodID()
将未初始化的类初始化。
参数:
env:JNI 接口指针。
返回值:
方法 ID,如果操作失败,则为 NULL
。
抛出:
NoSuchMethodError:如果找不到指定的静态方法。
ExceptionInInitializerError
:如果由于异常而导致类初始化程序失败。
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()
得到。
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相应的本地类型。
参数:
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的主要内容,如果未能解决你的问题,请参考以下文章
AndroLua on Lollipop:JNI DETECTED ERROR IN APPLICATION:无法调用static int org.keplerproject.luajava.LuaJ