In "PCSC sample in Java
" I presented the javax.smartcardio
wrapper to access smart cards from Java.
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.
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!
I wrote this blog article to document the problem and so that people can find the solution by themselves.