2011-03-09 3 views
0

내 문제는 다음과 같습니다. I 직렬 포트를두 클래스가 공유하는 JNI DLL이 동일한 함수 주소 공간을 사용합니까?

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 함수가 여러 인스턴스가 공유하는 방법이다. 그들은 각각 자신의 함수 사본을 얻습니까? 아니면 같은 함수를 호출하면 동시에 오류가 발생합니까? 당신이이 개 스레드에서 동일한 기능을 호출하는 경우

답변

0

각 기능의 복사본이 하나 있습니다. 각 호출은 로컬 변수 등을 포함하는 별도의 스택에서 발생합니다.

함수는 스레드로부터 안전 할 수도 있고 스레드로부터 안전하지 않을 수도 있습니다. 스레드로부터 안전하지 않으면 여러 스레드에서 동시에 다른 메소드를 호출해도 해로울 수 있습니다. 그들은 전역 변수에 액세스하는 것을 알고 있지만 동기화에 대해 알고 있는지 여부는 언급하지 않습니다. 클래스와 그 메소드가 쓰레드에 안전하다는 것을 설명하는 문서를 찾는다.

0

DLL 기능 (실제로는, Java 함수와 동일) 상태를 저장하고, 스레드 스위치는 기능의 모든 상태가 스택에 저장되며 다른 국가가 가져, 중간을 통해 발생 그래서 걱정하지 마라.

관련 문제