JNI静态变量
在上一篇中介绍了JNI实例类型。本文是JNI系列的第六篇,介绍JNI中的如何访问类静态变量。
系列文章的大纲如下:
- JNI 简介
- JNI 基本类型
- JNI String
- JNI 数组
- JNI 实例变量
- JNI 静态变量
- JNI 回调实例方法与静态方法
- JNI 调用Java中的super.method()
- JNI 中创建对象
- JNI 中创建对象数组
- JNI 中局部引用和全局引用
- JNI 动态注册
- 使用Android NDK编译Android的Native库
JNI 静态变量
上一篇讨论了如何访问并修改实例变量,这一篇讨论如何访问并修改静态变量。
访问静态变量的方法和访问实例变量的方法是类似的,只不过相应的方法名添加了Static
。
// 获取名字为name的静态变量的字段ID,其中sig为类型签名
jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
关于类型签名,可以参考JNI 基本类型。
// 获取类clazz的ID为jfieldID的静态变量。
NativeType GetStatic<type>Field(JNIEnv *env, jclass clazz, jfieldID fieldID);
其中:
GetStatic<type>Filed Routines | NativeType |
---|---|
GetStaticObjectField() | jobject |
GetStaticBooleanField() | jboolean |
GetStaticByteField() | jbyte |
GetStaticCharField() | jchar |
GetStaticShortField() | jshort |
GetStaticIntField() | jint |
GetStaticLongField() | jlong |
GetStaticFloatField() | jfloat |
GetStaticDoubleField() | jdouble |
// 设置类clazz的ID为fieldID的变量值为value。
void SetStatic<type>Field(JNIEnv *env, jclass clazz, jfieldID fieldID, NativeType value);
SetStatic<type>Filed Routines | NativeType |
---|---|
SetStaticObjectField() | jobject |
SetStaticBooleanField() | jboolean |
SetStaticByteField() | jbyte |
SetStaticCharField() | jchar |
SetStaticShortField() | jshort |
SetStaticIntField() | jint |
SetStaticLongField() | jlong |
SetStaticFloatField() | jfloat |
SetStaticDoubleField() | jdouble |
通过下面的实例来加深一下理解。
实例
我们来看一个实例。
还是Hello.java
package myjni;
public class Hello {
static {
System.loadLibrary("hello");
}
private static short bufferSize = 1024;
public static native void modifyStaticVariables();
public static void main(String[] args) {
modifyStaticVariables();
System.out.println("In Java, buffer size is " + bufferSize);
}
}
如果还不清楚如果生成头文件请参考JNI简介。
生成头文件myjni_Hello.h
的签名为:
/*
* Class: myjni_Hello
* Method: modifyStaticVariables
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_myjni_Hello_modifyStaticVariables
(JNIEnv *, jclass);
注意:这里生成的函数签名中的第二个参数是有变化,类型是jclass
。
实现函数Java_myjni_Hello_modifyStaticVariables
:
JNIEXPORT void JNICALL Java_myjni_Hello_modifyStaticVariables(JNIEnv *env, jclass clazz) {
jfieldID fidBufferSize = env->GetStaticFieldID(clazz, "bufferSize", "S");
if (fidBufferSize == NULL) {
return;
}
// Get the static variable
jshort bufferSize = env->GetStaticShortField(clazz, fidBufferSize);
std::cout << "In C++, the buffer size is " << bufferSize << std::endl;
// Change the static variable
env->SetStaticShortField(clazz, fidBufferSize, 64);
}
编译生成动态库,并运行Java程序得到输出:
In C++, the buffer size is 1024
In Java, buffer size is 64
vx搜:极客Furzoom,关注获取第一手资料。
本文完。