您可能知道,并且在Java Card Development Kit User Guide中提到,为Java Card平台编写大型应用程序的关键是将代码划分为各个包单元。对包最重要的限制是对最大组件大小的64KB限制。对于方法组件尤其如此:如果应用程序的方法组件的大小超过64KB,那么Java Card转换器将不处理包,并返回一个错误。
因此,我们需要在一些特殊情况下使用Java Card库包。我的问题是如何创建以及如何使用这些Java卡库包?
到目前为止我做了什么?
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);
}
}
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:>
问题:
更新:(基于亲爱的Vojta的回答)
CMD:> jar cfv mylib.jar D:\LibSRC\libPack\mylib.class
CMD:>
现在我想在我的小程序中使用我的库的sayhello()
方法:
正如你在上面看到的,我仍然收到一个错误。那是什么?据我所知,我不能在库包中定义静态方法(对吗?),那么我可以在哪里使用库方法呢?
任何带有一些公共类和公共方法的Java Card包都可以用作库。如果使用Eclipse JCOP工具,您可以非常容易地构建库:cap文件将在以下文件夹中自动创建:
/[workspace]/[project]/bin/[path according to package]/javacard
Java卡库就是任何一个包;即使是具有applet
的包也可以作为applet使用。因此,构建“公共”cap
文件和构建“库”cap
文件之间没有真正的区别。
注在库包中实现Shareable
接口的对象和静态方法之间有一点不同。Shareable
接口可用于从上下文B通过防火墙访问上下文A中的对象实例。但是,Static
方法可以从任何上下文访问--不适用防火墙规则。这里有一个关于AppletIsolation和对象共享的很好的概述。关于静态
方法的最重要的段落是6.1.6:
公共静态字段和公共静态方法可以从任何上下文中访问:静态方法在与其调用者相同的上下文中执行。
静态字段中引用的对象只是常规对象。它们归创建它们的人所有,并适用标准防火墙访问规则。如果有必要在多个上下文中共享它们,那么这些对象需要是可共享的接口对象。
当然,传统的Java技术保护仍然适用于静态字段和方法。此外,当安装小程序时,安装程序将验证是否允许每次尝试链接到外部静态字段或方法。安装和有关连接的细节超出了本规范的范围。
您有时需要在新的applet中使用现有的库,尽管您没有库的源代码。该库可能已被供应商或某个第三方加载到您的卡上。您需要库的jar
文件和exp
文件才能在applet中使用它。
您需要一个公共Javajar
文件中的库类文件,以便由Java编译器构建新的类文件。然后,您需要一些额外的信息,以便Java Card Converter将代码与库类及其方法链接起来。这就是exp
文件的用途。exp
文件描述cap
文件中所有公共组件的接口和依赖关系。Eclipse JCOP Tools在同一个文件夹中创建exp
文件和cap
文件,Java Card Converter也是如此。(请参阅Oracle的文档)
exp
文件和jar
文件是构建使用该库的代码所需的全部文件。只需将它们都放入项目中,并确保jar
文件位于项目的构建路径上。
随便问。
问题内容: 一般来说,我刚接触Java和Android编程,但是我想创建一个小型Java库,以便在普通(非Android)Java应用程序和Android应用程序之间共享一些代码;所以我的问题是用Eclipse创建普通Java库的最佳方法是什么? 我在任何地方都找不到从Eclipse创建新的Java库项目的选项。这是否意味着我必须使用普通的Java应用程序作为起点?因为这也将用于普通的Java应用
本文向大家介绍如何使用CSS创建产品卡?,包括了如何使用CSS创建产品卡?的使用技巧和注意事项,需要的朋友参考一下 要使用CSS创建产品卡,代码如下- 示例 上面的代码将产生以下输出-
问题内容: 我目前很容易绘制散点图,其中X轴是计算机名称,Y轴是其温度。如何绘制显示值而不是离散点的条形图? 我当前正在使用以下代码来渲染点: 我将如何修改此代码以获取从图的底部到该点的粗线而不是每个点的小方块? 谢谢。 问题答案: 我想我可能应该指出我是如何做到的-毕竟堆栈溢出也应该是一个存储库。在代码的早期是以下内容: 我扩展了形状渲染器,以始终返回正确宽度和高度的矩形,并将其放置在应该位于其
问题内容: 问候所有我想做的事情,例如触发器或侦听器(我不知道要做什么),它们将侦听特定的数据库表,并在此表上插入每个新记录后,执行一些Java代码,这意味着它检测到是否有可能插入新记录并获取其数据,我需要一些有关如何完成此过程的指南? 我正在使用Spring-Hibernate-PostgreSQL 问题答案: 这就是创建“ 侦听/提示 ”的目的。 唯一的缺点是您将需要某种类型的后台线程来定期轮
我在使用文本文件创建SQLite数据库时遇到了问题。我应该创建一个成员列表,其中包含以下内容:(成员)号、名字、姓氏、地址和电话号码(如果有的话)。我正在使用方法创建db,但我似乎无法让它正常工作。 文本文件是这样填充的('...'应该意味着列表中还有其他文件): 正如你可能看到的,一些成员没有电话号码,我认为这是导致db无法填充的原因。我之所以相信这一点,是因为我试图用所有信息制作自己的列表,这
问题内容: 问题: 是否可以在迁移脚本中创建一个新的数据库,然后连接到它?怎么样? 我的场景: 我正在尝试在Java项目(使用Jersey2.4 + tomcat 7 + PostgreSQL 9.3.1 + EclipseLink的RESTful应用程序)中使用flyway来管理使用git的不同开发人员之间的更改。我写了自己的初始化脚本,并运行了: 而且效果很好。问题是我无法使用脚本创建新的数据