In "
PCSC sample in Java" I presented the
javax.smartcardio wrapper to access smart cards from Java.
Problem
One big problem with the Oracle implementation is that only
one PC/SC context is created and used for all the javax.smartcardio calls.
The pcsc-lite documentation says for
SCardEstablishContext():
Each thread of an application shall use its own SCARDCONTEXT, unless calling SCardCancel(), which MUST be called with the same context as the context used to call SCardGetStatusChange().
The effect is that you can get dead locks in your Java application if you uses smartcardio in different threads.
Solution
One solution can be to use an alternative implementation of javax.smartcardio. One is available at
intarsys smartcard-io. It uses the BSD 3-clauses license.
The differences compared to the Oracle implementation are documented in
javax.smartcardio Provider:
The library comes with an alternative javax.smartcardio provider. There are a couple of things to consider:
- Intended differences
- dedicated PCSC context for terminals, terminal and card
- waitForChange(timeout) semantics improved(?), state change is reset even in case of timeout
- reader insertion is handled, too
- no finalizer for card!
Conclusion
I wrote this blog article to document the problem and so that people can find the solution by themselves.