如何创建和使用Java Card库包?

时间:2016-03-12 18:53:07

标签: java javacard

正如您所知,并且正如 Java Card开发工具包用户指南中所述,为Java Card平台编写大型应用程序的关键是将代码划分为单独的包单元。对程序包最重要的限制是对最大组件大小的64KB限制。对于这一点尤其如此 方法组件:如果应用程序的Method组件的大小超过64KB, 然后Java Card转换器将不处理包并将返回错误。

因此,我们需要在某些特殊情况下使用Java Card库包。我的问题是如何创建以及如何使用这些Java Card库包?

到目前为止我做了什么?

好吧,我写了一个非常简单的Java类,其中包含一个名为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文件(那些包含仅用于从Applet包创建cap的插件,我猜测),我使用命令行创建我的库的cap文件,如下所示:

1。生成上述.class计划的.java个文件:

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文件,其名称是我的库类名。我在同一目录中创建了一个文件夹并将其命名为“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 文件。

问题:

  1. 我是否以正确的方式完成了Java Card Library Package的生成过程?
  2. 如何在applet中使用此库包来减少尺寸较小的applet包?
  3. 更新:(根据亲爱的Vojta的回答)

    要使整个过程独立于IDE,我再次使用命令行中的以下命令创建库.jar文件的.class文件:

    CMD:> jar cfv mylib.jar D:\LibSRC\libPack\mylib.class
    CMD:>
    

    上面的命令,从命令行当前目录中的“mylib.class”文件创建了“mylib.jar”。

    之后我将这个“mylib.jar”文件及其已经创建的.exp文件(使用Converter的上一步)添加到Netbeans IDE中的Applet项目,就像我解释here一样

    现在我想在我的applet中使用我的库的sayHello()方法:

    enter image description here

    如上所述,我仍然收到错误消息。那是什么?据我所知,我无法在库包中定义静态方法(对吗?),所以我可以在哪里使用库方法?

1 个答案:

答案 0 :(得分:5)

任何包含一些公共类和公共方法的Java Card包都可以用作库。如果您使用Eclipse JCOP Tools,则可以非常轻松地构建库:cap文件在文件夹中自动创建:

/[workspace]/[project]/bin/[path according to package]/javacard

Java Card库就是任何包;甚至包含Applet的包也可以用作一个包。因此,构建“通用”cap文件和“库”cap文件之间没有真正的区别。

请注意,在库包中实现Shareable接口和静态方法的对象之间存在一些差异。 Shareable接口可用于通过上下文B中的防火墙访问上下文A中的对象实例。但是,static方法可以从任何上下文访问 - 不应用防火墙规则。对AppletIsolation and Object Sharing here有一个很好的概述。关于static方法的最重要段落是6.1.6:

  

类 - 对象的实例 - 由上下文拥有;班级本身不是。访问类静态字段时,不能执行运行时上下文检查。调用静态方法时也没有上下文切换。

     

可以从任何公共静态字段和公共静态方法访问它们   context:静态方法在与调用者相同的上下文中执行。

     

静态字段中引用的对象只是常规对象。他们是   由任何人创建它们和标准防火墙访问规则   应用。如果有必要在多个上下文中共享它们,那么   这些对象需要是可共享的接口对象(SIO)。

     

当然,传统的Java技术保护仍然存在   对静态字段和方法强制执行。另外,当applet是   安装后,安装程序会验证每次链接到的尝试   允许外部静态字段或方法。安装和   关于链接的细节超出了本规范的范围。

简而言之:静态库中没有静态对象=不需要Shareable

您有时需要在新applet中使用现有库,尽管您没有库的源代码。库可能已由供应商或某些第三方加载到您的卡中。您需要jar文件和库的exp文件才能在您的小程序中使用它。

您需要在通用Java jar文件中使用库的类文件来通过Java编译器构建新的类文件。然后,您需要Java Card Converter的一些额外信息,以将您的代码与库类及其方法相关联。这就是exp文件的用途。 exp文件描述了cap文件中所有公共组件的接口和依赖关系。 Eclipse JCOP Tools在同一文件夹中创建exp文件和cap文件,以及Java Card Converter。 (See the documentation by Oracle

exp文件和jar文件是构建使用库的代码所需的全部内容。只需将它们放入项目中,并确保jar文件位于项目的构建路径中。

随意问。