次のコードでjavax.smartcardioAPIを使用してスマートカード端末をロードしようとしています。
public CardTerminal getReadyCardTerminal() throws CardException {
TerminalFactory factory = TerminalFactory.getDefault();
CardTerminals terminals = factory.terminals();
List<CardTerminal> list = terminals.list(State.CARD_PRESENT);
while (list.isEmpty()) {
terminals.waitForChange(1000);
list = terminals.list(State.CARD_PRESENT);
}
CardTerminal cardTerminal = list.get(0);
return cardTerminal;
}
...そして私は常に次の例外を受け取ります:
java.lang.IllegalStateException: no terminals
at javax.smartcardio.TerminalFactory$NoneCardTerminals.waitForChange(TerminalFactory.java:145)
Windows Vista / 7ではすべて正常に動作しますが、Linuxでは動作しません。Ubuntu12.0464ビットを使用しています。
次のコマンドを使用してpcscdサービスをインストールしました。
sudo apt-get install libccid pcscd libpcsclite-dev libpcsclite1
sudo service pcscd start
そして、pcsc_scanコマンドはこれを出力します:
PC/SC device scanner
V 1.4.18 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.7.4
Using reader plug'n play mechanism
Scanning present readers...
0: OMNIKEY CardMan 3x21 00 00
Tue Sep 11 15:44:49 2012
Reader 0: OMNIKEY CardMan 3x21 00 00
Card state: Card inserted,
ATR: <some hexa codes>
...
したがって、すべてが正常に見えますが、smartcardioは機能しません。OracleとOpenJDK1.7.0_05、32ビットと64ビットの両方で試しています。
コードは、Ubuntu 32ビット環境でOpenJDK(ただし、Oracle JDKではなく、理由はわかりません)で正常に実行されます。したがって、JavaからPC/SCライブラリへの64ビットブリッジに問題があると思います。
何か案は?
ありがとう。