我正在尝试使用javax.smartcardio应用程序接口加载智能卡终端,代码如下:
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上工作。我使用的是Ubuntu 12.04 64位。
我使用以下命令安装了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>
...
所以看起来一切正常,但智能有氧运动就是不起作用。我正在尝试使用32位和64位的Oracle和OpenJDK 1.7.0_05。
在Ubuntu32位环境中,代码可以在OpenJDK上运行(但不能在Oracle JDK上运行,不知道为什么)。所以我认为这是从Java到PC/SC库的64位桥的问题。
有什么想法吗?
谢谢。
发布于 2012-09-12 18:55:55
我想我找到了解决这个问题的办法,因为我刚刚遇到了类似的问题。在bugreport from ubuntu中,它显示javax.smartcardio库在错误的目录中搜索PC/SC库。
通过在我的机器上指定PC/SC库的路径,就像bugreport提到的那样,我让它正常工作。
bugreport中的路径对我来说是错误的,我使用的是64位的fedora,其中pc/sc库安装在/usr/lib64/libpcsclite.so.1。
因此,我的解决方法是指定java的库路径,如下所示:
java -Dsun.security.smartcardio.library=/usr/lib64/libpcsclite.so.1
根据你的Linux发行版的不同,libpcsclite.so.1
的位置可能会有所不同,它也可能在/lib/x86_64-linux-gnu/libpcsclite.so.1
(即Kubuntu15.04)。在这种情况下,可以这样调用它:
java -Dsun.security.smartcardio.library=/lib/x86_64-linux-gnu/libpcsclite.so.1
发布于 2013-12-30 11:53:43
我正在使用带有debian arm版本的raspberry
首先使用以下命令查找libpcsclite的位置:
$ ldd -r /usr/bin/pcsc_scan
然后使用libpcsclite位置:
java -Dsun.security.smartcardio.library=/usr/lib/arm-linux-gnueabihf/libpcsclite.so.1
发布于 2015-03-03 20:28:40
对于在Ubuntu 14上使用64位机器的其他人来说。我发现.so文件实际上位于以下目录中
/usr/lib/x86_64-linux-gnu/libpcsclite.so
因此,使用下面的设置运行我的应用程序对我来说很有效
-Dsun.security.smartcardio.library=/usr/lib/x86_64-linux-gnu/libpcsclite.so
https://stackoverflow.com/questions/12376257
复制相似问题