如何创建和使用Java卡库包?
How to create and use Java Card library packages?
您可能知道,正如 Java 卡开发工具包用户指南 中提到的,为 Java 编写大型应用程序的关键卡平台就是把代码分成一个个的包单元。包最重要的限制是最大组件大小的 64KB 限制。这对于
方法组件:如果应用程序的方法组件大小超过 64KB,
那么 Java 卡转换器将不会处理该包,并且会 return 出错。
所以,在某些特殊情况下,我们需要使用Java卡片库包。我的问题是如何创建和使用这些 Java 卡片库包?
到目前为止我做了什么?
好吧,我写了一个非常简单的 Java Class,其中包含一个名为 sayHello()
的方法,如下所示:
package libPack;
import javacard.framework.*;
public class mylib {
public static final byte[] hello = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o'};
protected mylib() {
}
public void sayHello(APDU apdu) {
byte[] buffer = apdu.getBuffer();
Util.arrayCopyNonAtomic(hello, (short)0x00, buffer, (short)0x00, (short)hello.length);
apdu.setOutgoingAndSend((short)0x00, (short)buffer.length);
}
}
因为我在我的 IDE-s(Netbeans 和 Eclipse)中找不到任何选项来创建库包的 cap
文件(那些有用于创建 cap
的插件我猜只有 Applet 包),我使用命令行来创建我的库的 cap 文件,如下所示:
1.生成上述.java
程序的.class
文件:
CMD:> javac -g -source 1.2 -target 1.2 -cp "D:\JCDK\java_card_kit-2_2_2\lib\api.jar" "D:\LibSrc\mylib.java"
warning: [options] bootstrap class path not set in conjunction with -source 1.2
1 warning
CMD:>
以上命令生成一个.class
文件,其名称是我的库class名称。我在同一目录中创建了一个文件夹并将其命名为 "libPack"(程序的包名称),然后将此 .class
文件移入其中。
2. 将创建的 .class
文件转换为 .cap
文件:
CMD:> D:\JCDK\java_card_kit-2_2_2\bin\converter.bat -debug -verbose -exportpath D:\JCDK\java_card_kit-2_2_2\api_export_files -classdir D:\LibSRC libPack 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 D:\LibSRC\libPack\mylib.class
converting libPack.mylib
parsing D:\JCDK\java_card_kit-2_2_2\api_export_files\java\lang\javacard\lang.exp
parsing D:\JCDK\java_card_kit-2_2_2\api_export_files\javacard\framework\javacard\framework.exp
writing D:\LibSRC\libPack\javacard\libPack.exp
writing D:\LibSRC\libPack\javacard\libPack.jca
conversion completed with 0 errors and 0 warnings.
CMD:>
以上命令,在"libPack\javacard"目录下生成libPack.cap和libPack.exp文件。
问题:
- 我的 Java 卡片库包生成过程是否正确?
- 如何在我的小程序中使用这个库包来减小我的小程序包的大小?
更新:(基于亲爱的 Vojta 的回答)
为了使整个过程 IDE-独立,我再次在命令行中使用以下命令创建我的库 .class
文件的 .jar
文件:
CMD:> jar cfv mylib.jar D:\LibSRC\libPack\mylib.class
CMD:>
上述命令,从命令行当前目录中的"mylib.class"文件创建了"mylib.jar"。
之后,我将此 "mylib.jar" 文件及其已创建的 .exp
文件(上一步使用 Converter)添加到我在 Netbeans IDE 中的 Applet 项目中,方法与我相同解释 .
现在我想在我的小程序中使用我的库的sayHello()
方法:
正如您在上面看到的,我仍然收到错误消息。那是什么?据我所知,我不能在库包中定义静态方法(对吗?),那么我可以在哪里使用库方法?
任何Java卡包,包含一些publicclasses和public方法,都可以作为库使用。如果您使用 Eclipse JCOP 工具,您可以非常轻松地构建您的库:cap 文件在文件夹中自动创建:
/[workspace]/[project]/bin/[path according to package]/javacard
A Java 卡片库只是任何包;即使是带有 Applet
的包也可以作为一个包使用。因此,构建 "common" cap
文件和构建 "library" cap
文件之间没有真正的区别。
请注意,在您的库包中实现 Shareable
接口和静态方法的对象之间略有不同。 Shareable
接口可用于从上下文 B 通过防火墙访问上下文 A 中的对象实例。但是,static
方法可从任何上下文访问 - 不适用防火墙规则。 AppletIsolation and Object Sharing here 有一个很好的概述。 static
方法最重要的段落是 6.1.6:
Instances of classes—objects—are owned by contexts; classes themselves are not. There is no runtime context check that can be performed when a class static field is accessed. Neither is there a context switch when a static method is invoked.
Public static fields and public static methods are accessible from any
context: static methods execute in the same context as their caller.
Objects referenced in static fields are just regular objects. They are
owned by whomever created them and standard firewall access rules
apply. If it is necessary to share them across multiple contexts, then
these objects need to be Shareable Interface Objects (SIOs).
Of course, the conventional Java technology protections are still
enforced for static fields and methods. In addition, when applets are
installed, the Installer verifies that each attempt to link to an
external static field or method is permitted. Installation and
specifics about linkage are beyond the scope of this specification.
简而言之:静态库中没有静态对象 = 不需要 Shareable
。
您有时需要在您的新小程序中使用现有的库,尽管您没有该库的源代码。该库可能已由供应商或某些第三方加载到您的卡中。您需要一个 jar
文件和一个 exp
库文件才能在您的小程序中使用它。
您需要 class 库文件在一个公共 Java jar
文件中,以便 Java 编译器构建新的 class 文件。然后您需要一些额外的信息,以便 Java 卡片转换器将 link 您的代码与库 classes 及其方法。这就是 exp
文件的用途。 exp
文件描述了cap
文件中所有public 组件的接口和依赖关系。 Eclipse JCOP Tools 在同一文件夹中创建 exp
文件和 cap
文件,Java Card Converter 也是如此。 (See the documentation by Oracle)
exp
文件和 jar
文件是构建使用该库的代码所需的全部。只需将它们都放入您的项目中,并确保 jar
文件位于您项目的构建路径中。
欢迎提问。
您可能知道,正如 Java 卡开发工具包用户指南 中提到的,为 Java 编写大型应用程序的关键卡平台就是把代码分成一个个的包单元。包最重要的限制是最大组件大小的 64KB 限制。这对于 方法组件:如果应用程序的方法组件大小超过 64KB, 那么 Java 卡转换器将不会处理该包,并且会 return 出错。
所以,在某些特殊情况下,我们需要使用Java卡片库包。我的问题是如何创建和使用这些 Java 卡片库包?
到目前为止我做了什么?
好吧,我写了一个非常简单的 Java Class,其中包含一个名为 sayHello()
的方法,如下所示:
package libPack;
import javacard.framework.*;
public class mylib {
public static final byte[] hello = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o'};
protected mylib() {
}
public void sayHello(APDU apdu) {
byte[] buffer = apdu.getBuffer();
Util.arrayCopyNonAtomic(hello, (short)0x00, buffer, (short)0x00, (short)hello.length);
apdu.setOutgoingAndSend((short)0x00, (short)buffer.length);
}
}
因为我在我的 IDE-s(Netbeans 和 Eclipse)中找不到任何选项来创建库包的 cap
文件(那些有用于创建 cap
的插件我猜只有 Applet 包),我使用命令行来创建我的库的 cap 文件,如下所示:
1.生成上述.java
程序的.class
文件:
CMD:> javac -g -source 1.2 -target 1.2 -cp "D:\JCDK\java_card_kit-2_2_2\lib\api.jar" "D:\LibSrc\mylib.java"
warning: [options] bootstrap class path not set in conjunction with -source 1.2
1 warning
CMD:>
以上命令生成一个.class
文件,其名称是我的库class名称。我在同一目录中创建了一个文件夹并将其命名为 "libPack"(程序的包名称),然后将此 .class
文件移入其中。
2. 将创建的 .class
文件转换为 .cap
文件:
CMD:> D:\JCDK\java_card_kit-2_2_2\bin\converter.bat -debug -verbose -exportpath D:\JCDK\java_card_kit-2_2_2\api_export_files -classdir D:\LibSRC libPack 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 D:\LibSRC\libPack\mylib.class
converting libPack.mylib
parsing D:\JCDK\java_card_kit-2_2_2\api_export_files\java\lang\javacard\lang.exp
parsing D:\JCDK\java_card_kit-2_2_2\api_export_files\javacard\framework\javacard\framework.exp
writing D:\LibSRC\libPack\javacard\libPack.exp
writing D:\LibSRC\libPack\javacard\libPack.jca
conversion completed with 0 errors and 0 warnings.
CMD:>
以上命令,在"libPack\javacard"目录下生成libPack.cap和libPack.exp文件。
问题:
- 我的 Java 卡片库包生成过程是否正确?
- 如何在我的小程序中使用这个库包来减小我的小程序包的大小?
更新:(基于亲爱的 Vojta 的回答)
为了使整个过程 IDE-独立,我再次在命令行中使用以下命令创建我的库 .class
文件的 .jar
文件:
CMD:> jar cfv mylib.jar D:\LibSRC\libPack\mylib.class
CMD:>
上述命令,从命令行当前目录中的"mylib.class"文件创建了"mylib.jar"。
之后,我将此 "mylib.jar" 文件及其已创建的 .exp
文件(上一步使用 Converter)添加到我在 Netbeans IDE 中的 Applet 项目中,方法与我相同解释
现在我想在我的小程序中使用我的库的sayHello()
方法:
正如您在上面看到的,我仍然收到错误消息。那是什么?据我所知,我不能在库包中定义静态方法(对吗?),那么我可以在哪里使用库方法?
任何Java卡包,包含一些publicclasses和public方法,都可以作为库使用。如果您使用 Eclipse JCOP 工具,您可以非常轻松地构建您的库:cap 文件在文件夹中自动创建:
/[workspace]/[project]/bin/[path according to package]/javacard
A Java 卡片库只是任何包;即使是带有 Applet
的包也可以作为一个包使用。因此,构建 "common" cap
文件和构建 "library" cap
文件之间没有真正的区别。
请注意,在您的库包中实现 Shareable
接口和静态方法的对象之间略有不同。 Shareable
接口可用于从上下文 B 通过防火墙访问上下文 A 中的对象实例。但是,static
方法可从任何上下文访问 - 不适用防火墙规则。 AppletIsolation and Object Sharing here 有一个很好的概述。 static
方法最重要的段落是 6.1.6:
Instances of classes—objects—are owned by contexts; classes themselves are not. There is no runtime context check that can be performed when a class static field is accessed. Neither is there a context switch when a static method is invoked.
Public static fields and public static methods are accessible from any context: static methods execute in the same context as their caller.
Objects referenced in static fields are just regular objects. They are owned by whomever created them and standard firewall access rules apply. If it is necessary to share them across multiple contexts, then these objects need to be Shareable Interface Objects (SIOs).
Of course, the conventional Java technology protections are still enforced for static fields and methods. In addition, when applets are installed, the Installer verifies that each attempt to link to an external static field or method is permitted. Installation and specifics about linkage are beyond the scope of this specification.
简而言之:静态库中没有静态对象 = 不需要 Shareable
。
您有时需要在您的新小程序中使用现有的库,尽管您没有该库的源代码。该库可能已由供应商或某些第三方加载到您的卡中。您需要一个 jar
文件和一个 exp
库文件才能在您的小程序中使用它。
您需要 class 库文件在一个公共 Java jar
文件中,以便 Java 编译器构建新的 class 文件。然后您需要一些额外的信息,以便 Java 卡片转换器将 link 您的代码与库 classes 及其方法。这就是 exp
文件的用途。 exp
文件描述了cap
文件中所有public 组件的接口和依赖关系。 Eclipse JCOP Tools 在同一文件夹中创建 exp
文件和 cap
文件,Java Card Converter 也是如此。 (See the documentation by Oracle)
exp
文件和 jar
文件是构建使用该库的代码所需的全部。只需将它们都放入您的项目中,并确保 jar
文件位于您项目的构建路径中。
欢迎提问。