java - 在 JNI 实现中创建静态全局变量不好吗?

标签 java c performance static java-native-interface

我是 JNI 的新手,所以这个天真的问题的答案可能是肯定的。

手头的问题是我正在实现 JNI 绑定(bind)到某些 C 库以完成繁重的工作。

在进行实际计算之前,C 库需要首先从共享内存加载辅助数据结构(并返回指向“大”结构的指针),或者如果结构不是,则通过提供的路径从磁盘加载在共享内存中可用。

辅助结构将用作const

为了避免每次都从磁盘加载,我正在考虑创建一个 static int 来表示大结构已正确初始化:

static int big_struct_loaded_in_mem = 0;

void Java_className_dowork(/*parameters*/){
    if(!big_struct_loaded_in_mem){
        // load struct
        big_struct_loaded_in_mem = 1;
    }
    // load from shared mem then do work using big_struct
    load_from_shm();
}

void Java_className_cleanup(/*parameters*/){
    //free up mem
    big_struct_loaded_in_mem = 0;
}

为简单起见,假设 Java 调用者和 native 函数是单线程的。

非常感谢!

注意:当然,没有 static int 的简单修复可能只是每次调用 load_from_shm() 并测试返回的指针,但我很好奇这个想法是否不好:即在 JNI 绑定(bind)中创建一个静态全局变量。

最佳答案

是的,您应该避免在 JNI 中使用全局静态。

Java 可以加载一个类的多个实例(因为例如有多个类加载器)并且静态将在所有实例之间共享。不幸的是,如果您的类的一个实例被销毁而另一个仍在使用中,清理调用也会导致不一致。

在那些时候使用本地类构造函数/终结器并分配/释放内存资源会更聪明。这还允许使用不同的配置等用例,具体取决于哪个 ClassLoader 加载了您的类——例如在 EJB 应用程序容器中。

To make things simple, assume that the Java caller and the native function are single-threaded.

错误的假设。 JVM 在幕后做很多事情。

关于java - 在 JNI 实现中创建静态全局变量不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36974548/

相关文章:

java - 将音频记录保存到文件对象

java - Java 版本在 Websphere 中意味着什么?

java - 使用 BouncyCaSTLe 接受过期的 CRL

c++:更多的小文件还是更少的大文件?

javascript - 以下代码的速记或效率

java - Spring 集成 : Calling event once certain sets of events have performed their task successfully.

c++ - 如何解释此错误,堆摘要,未初始化的变量?

c - C 中的舍入 float

c - 调试断言失败 _crtisValidHeapPointer(block)

javascript - 添加对象数组javascript的值