繁体   English   中英

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

[英]How to create and use Java Card library packages?

您可能知道,正如Java Card Development Kit User Guide 中提到的,为 Java Card 平台编写大型应用程序的关键是将代码划分为单独的包单元。 对包最重要的限制是最大组件大小的 64KB 限制。 对于 Method 组件尤其如此:如果应用程序的 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、生成上述.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文件,它的名字是我的库类名。 我在同一目录中创建了一个文件夹并将其命名为“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 Card 库包生成过程?
  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 Card 包都可以用作库。 如果您使用 Eclipse JCOP 工具,您可以非常轻松地构建您的库:cap 文件会在文件夹中自动创建:

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

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


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

类的实例——对象——归上下文所有; 类本身不是。 当访问类静态字段时,没有可以执行的运行时上下文检查。 调用静态方法时也没有上下文切换。

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

静态字段中引用的对象只是常规对象。 它们归创建它们的任何人所有,并且适用标准的防火墙访问规则。 如果需要跨多个上下文共享它们,则这些对象需要是可共享接口对象 (SIO)。

当然,传统的 Java 技术保护仍然适用于静态字段和方法。 此外,在安装小程序时,安装程​​序会验证是否允许每次尝试链接到外部静态字段或方法。 安装和连接的细节超出了本规范的范围。

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


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

您需要通用 Java jar文件中的库类文件,以通过 Java 编译器构建新的类文件。 然后您需要一些额外的信息让 Java Card Converter 将您的代码与库类及其方法链接起来。 这就是exp文件的用途。 exp文件在一个cap文件中描述了所有公共组件的接口和依赖关系。 Eclipse JCOP 工具和 Java Card Converter 一样在同一文件夹中创建exp文件和cap文件。 请参阅 Oracle 的文档

您只需要exp文件和jar文件即可构建使用该库的代码。 只需将它们都放入您的项目中,并确保jar文件位于项目的构建路径上。

随意问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM