两个类共享的JNI DLL是否使用相同的函数地址空间?

时间:2011-03-09 19:51:01

标签: java dll java-native-interface

我的问题如下;我有一个使用非静态本机方法通过串口进行通信的类

public class Serial{
    final static int NOT_INITIALIZED = 0;
    final static int INITIALIZED = 1;

    private int instanceId;
    private String errorString;

    private native int initPort(String port);
    private native int termPort(int instanceId);
    private native int getState(int instanceId);
    private native int readPort(int instanceId);
    private native int writePort(int instanceId);

    /*... publically accessible methods follow */
}

因此可以实例化多个类,每个类都有一个特定的串行端口。我之所以这样做,是因为它允许您为调用JNI代码的实例设置JNI代码中的“errorString”字段(发生错误时)。

我了解到同一JVM上的多个实例将共享相同的JNI dll。因此,dll中定义的任何全局变量都将由多个实例共享。因此,通信句柄和状态变量存储在全局结构数组中。调用initPort()时,instanceId字段设置为包含端口句柄和状态(INITIALIZED或NOT_INITIALIZED)的数组索引。

我不明白的是多个实例如何共享dll函数。他们每个人都得到自己的功能副本,还是会同时调用同一个功能导致错误?

2 个答案:

答案 0 :(得分:0)

DLL函数是无状态的(实际上与Java函数相同)如果从2个线程调用相同的函数,并且线程切换发生在中途,则函数的所有状态都将存储在堆栈中,而其他状态将被引入所以不要担心。

答案 1 :(得分:0)

每个功能都有一个副本。每次调用都是使用包含局部变量等的单独堆栈进行的。

您的功能可能是线程安全的,也可能不是线程安全的。如果不是线程安全的,从多个线程同时调用甚至不同的方法可能是有害的。您知道它们访问全局变量,但不提及您是否知道任何同步。查找文档,声明该类及其方法旨在是线程安全的。