首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Linux64位访问javax.smartcardio

从Linux64位访问javax.smartcardio
EN

Stack Overflow用户
提问于 2012-09-12 03:02:56
回答 6查看 12.2K关注 0票数 24

我正在尝试使用javax.smartcardio应用程序接口加载智能卡终端,代码如下:

代码语言:javascript
复制
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;
}

..。并且我总是得到以下异常:

代码语言:javascript
复制
java.lang.IllegalStateException: no terminals
at javax.smartcardio.TerminalFactory$NoneCardTerminals.waitForChange(TerminalFactory.java:145)

在Windows Vista/7上一切正常,但我不能让它在Linux上工作。我使用的是Ubuntu 12.04 64位。

我使用以下命令安装了pcscd服务:

代码语言:javascript
复制
sudo apt-get install libccid pcscd libpcsclite-dev libpcsclite1
sudo service pcscd start

pcsc_scan命令打印以下内容:

代码语言:javascript
复制
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位桥的问题。

有什么想法吗?

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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的库路径,如下所示:

代码语言:javascript
复制
java -Dsun.security.smartcardio.library=/usr/lib64/libpcsclite.so.1

根据你的Linux发行版的不同,libpcsclite.so.1的位置可能会有所不同,它也可能在/lib/x86_64-linux-gnu/libpcsclite.so.1 (即Kubuntu15.04)。在这种情况下,可以这样调用它:

代码语言:javascript
复制
java -Dsun.security.smartcardio.library=/lib/x86_64-linux-gnu/libpcsclite.so.1
票数 38
EN

Stack Overflow用户

发布于 2013-12-30 11:53:43

我正在使用带有debian arm版本的raspberry

首先使用以下命令查找libpcsclite的位置:

代码语言:javascript
复制
$ ldd -r /usr/bin/pcsc_scan

然后使用libpcsclite位置:

代码语言:javascript
复制
java -Dsun.security.smartcardio.library=/usr/lib/arm-linux-gnueabihf/libpcsclite.so.1
票数 8
EN

Stack Overflow用户

发布于 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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12376257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档