[英]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.cap和libPack.exp文件。
问题:
更新:(基于亲爱的 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.