Java 卡片转换器:不支持 class 50.0 版的文件格式

Java Card Converter: unsupported class file format of version 50.0

我正在尝试从样本目录下 Java Card SDK 中的标准 Wallet.java 生成一个 CAP 文件和一个导出文件。我编译class,使用转换器,遇到以下情况:

$ javac -g -d classes/ src/com/sun/javacard/samples/wallet/Wallet.java
$ converter -debug -verbose -classdir "$JC_HOME/samples/src" com.sun.javacard.samples.wallet 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x6:0x1 1.0

Java Card 2.2.2 Class File Converter, Version 1.3
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.

parsing /home/user/javacard/java_card_kit-2_2_2/samples/src/com/sun/javacard/samples/wallet/Wallet.class
error: com.sun.javacard.samples.wallet.Wallet: unsupported class file format of version 50.0.

conversion completed with 1 errors and 0 warnings.

我的Java版本和javac版本一样,Java1.6:

$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
$ javac -version
javac 1.6.0_45

我在 Ubuntu 14.04 上使用 JC SDK 2.2.2。转换器的版本是1.3:

$ converter -version
Java Card 2.2.2 Class File Converter, Version 1.3
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.

我似乎无法解决这个 "unsupported class file format of version 50.0" 错误。鉴于 Java 1.6 是版本 50.0.

,我对为什么会遇到此错误感到有些困惑

有没有其他人遇到同样的问题?

Java Card 2.2.2转换器最多支持Java5class文件格式(因此它告诉你Java6/版本50.0是支持)。因此,使用较新的 JDK 版本编译源代码时,需要指定源 compatibility/class 文件版本:

javac -g -source 1.5 -target 1.5 -d classes/ src/com/sun/javacard/samples/wallet/Wallet.java

同样,对于 Java Card 2.2.1,您将使用 1.2 版:

javac -g -source 1.2 -target 1.2 -d classes/ src/com/sun/javacard/samples/wallet/Wallet.java

而对于 Java Card 2.1.1 (JC SDK 2.1.2),您将使用版本 1.1:

javac -g -source 1.1 -target 1.1 -d classes/ src/com/sun/javacard/samples/wallet/Wallet.java

您可以使用 Java class 文件反汇编程序检查 class 文件的版本(感谢 @cmanning 提到这一点):

javap -v -cp classes/ com.sun.javacard.samples.wallet.Wallet |grep 'version'

您可能想查看 ant-javacard 自动执行此类操作(如编译器标志取决于 JC SDK 版本)。 (免责声明:我做到了)