Использует ли библиотека JNI, совместно используемая двумя классами, одно и то же адресное пространство функции? - PullRequest
0 голосов
/ 09 марта 2011

Моя проблема заключается в следующем;У меня есть класс, который использует нестатические собственные методы для связи через последовательный порт

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 */
}

Таким образом, можно создать несколько классов, каждый с определенным последовательным портом.Причина, по которой я так поступаю, заключается в том, что он позволяет вам установить поле errorString из кода JNI (когда возникает ошибка) для экземпляра, который вызвал код JNI.

Я узнал, что несколько экземпляров в одной и той же JVM будут использовать одну и ту же библиотеку JNI.Таким образом, любые глобальные переменные, определенные в dll, будут совместно использоваться несколькими экземплярами.По этой причине дескрипторы связи и переменные состояния хранятся в глобальном массиве структур.Когда вызывается initPort (), поле instanceId устанавливается на индекс массива, который содержит дескриптор порта и состояние (INITIALIZED или NOT_INITIALIZED).

Что я не понимаю, так это то, как функции dll совместно используются несколькими экземплярами.Каждый из них получает свою собственную копию функции или вызовет одну и ту же функцию одновременно и вызовет ошибки?

Ответы [ 2 ]

0 голосов
/ 09 марта 2011

Существует одна копия каждой функции. Каждый вызов происходит с отдельным стеком, содержащим локальные переменные и т. Д.

Ваши функции могут быть поточно-ориентированными или не поточно-ориентированными. Если не потокобезопасен, вызов даже разных методов одновременно из нескольких потоков может быть вредным. Вы знаете, что они обращаются к глобальным переменным, но не упоминаете, знаете ли вы о какой-либо синхронизации. Ищите документацию, утверждающую, что класс и его методы предназначены для обеспечения многопоточности.

0 голосов
/ 09 марта 2011

DLL-функции не сохраняют состояние (на самом деле то же самое, что и функции Java). Если вы вызываете одну и ту же функцию из двух потоков, и переключение потоков происходит на полпути, все состояния функции сохраняются в стеке, а другое состояние возвращаетсяТак что не беспокойся.

...