如何创建和使用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.caplibPack.exp文件。

问题:

  1. 我的 Java 卡片库包生成过程是否正确?
  2. 如何在我的小程序中使用这个库包来减小我的小程序包的大小?

更新:(基于亲爱的 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 文件位于您项目的构建路径中。

欢迎提问。