JNI静态变量

JNI静态变量

在上一篇中介绍了JNI实例类型。本文是JNI系列的第六篇,介绍JNI中的如何访问类静态变量。

系列文章的大纲如下:

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 RoutinesNativeType
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 RoutinesNativeType
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,关注获取第一手资料。

本文完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫竹梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值