当前位置: 首页 > 面试题库 >

从Linux 64位访问javax.smartcardio

梁丘洲
2023-03-14
问题内容

我试图使用带有以下代码的javax.smartcardio API加载智能卡终端:

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>
  ...

因此,一切看起来都很好,但是smartcardio却无法正常工作。我正在尝试使用Oracle和OpenJDK 1.7.0_05(32位和64位)。

该代码可以在Ubuntu 32位环境中与OpenJDK一起正常运行(但不能与Oracle JDK一起运行,实际上不知道为什么)。因此,我认为从Java到PC
/ SC库的64位桥存在问题。

有任何想法吗?

谢谢。


问题答案:

我想我已经找到了解决方法,因为我遇到了类似的问题。在来自ubuntu的错误报告中,它表示javax.smartcardio库在错误的目录中搜索PC
/ SC库。

通过指定机器上PC / SC库的路径(如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(例如Kubuntu 15.04)。在这种情况下,可以这样称呼它:

java -Dsun.security.smartcardio.library=/lib/x86_64-linux-gnu/libpcsclite.so.1


 类似资料:
  • 我在Windows 8.164位计算机上运行了python 2.732位。 我有Access2013和一个。accdb文件,我正试图从python和PyodBC访问它。 我可以在64位ODBC管理器中创建一个64位DSN。但是,当我试图从python连接到它时,我得到了错误: 有可能做我正在努力做的事吗?--32位python访问一个访问2013.accdb文件?

  • 问题内容: 我需要一个允许我使用Java在Gmail中进行电子邮件操作(例如,发送/接收邮件)的库。 问题答案: 您是否看到过Java的g4j-GMail API? GMailer Java版API(g4j)是一组API,允许Java程序员与GMail进行通信。借助G4J,程序员可以制作基于GMail大量存储的基于Java的应用程序。

  • 问题内容: 我被困在一个相当复杂的Python模块中,该模块不会返回有用的错误代码(它实际上会无声地失败而失败)。但是,它调用的基础C库设置了errno。 通常,errno是通过OSError属性传入的,但是由于我没有异常,因此无法理解。 使用ctypes时,libc.errno不起作用,因为errno是GNU libc中的宏。Python 2.6有一些优势,但Debian仍使用Python 2.

  • 问题内容: 您如何从Java 访问? 最后一行使编译器死于“ scala类型。None不带参数”。 由于“找不到符号构造函数None()”而失败: 由于“找不到符号变量无”而失败: 在2007年,这曾经奏效,但后来Scala改变了。Java编译器提供: 问题答案: 这可能起作用: def apply [A](x:A):Option [A] 一个Option工厂,如果参数不为null,则创建Some

  • 问题内容: 我在访问SimpleXML对象的部分时遇到问题。当我整个对象时,我得到正确的输出,而当我其余对象(嵌套标签)时,我得到正确的输出,但是当我遵循docs和时 ,我得到一个空对象,尽管事实是第一个清楚地表明,存在要输出的属性。 任何人都知道我在这里做错了/如何进行这项工作? 问题答案: 您可以通过在XML节点上调用attribute()函数来获取XML元素的属性。然后,您可以var_dum

  • 目前正在尝试从JAVA访问类型库文件,我尝试了以下操作并出现了相应的错误: 1- Com2Java:每次尝试连接到我的应用程序时,我都会收到此错误: 默认情况下,在客户端版本的Windows上不启用小型转储 2- Com4j:它只产生接口,无法理解如何使用它们(我找不到任何类,只有接口) 3-经过小搜索,发现了Visual J,但无法下载它,因为它被剥夺了。 任何人都可以提供建议吗? 非常感谢。