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

2024-01-30

正如您可能知道的,正如中提到的Java 卡开发套件用户指南为Java Card平台编写大型应用程序的关键是将代码划分为单独的包单元。软件包最重要的限制是最大组件大小为 64KB。对于 方法组件:如果应用程序的方法组件的大小超过 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(Netbeans 和 Eclipse)中找不到任何选项来创建cap库包文件(那些有用于创建的插件cap我猜,仅来自 Applet 包),我使用命令行创建库的 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 file:

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.cap and libPack.exp“libPack\javacard”目录中的文件。

问题:

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

更新:(基于亲爱的 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 https://stackoverflow.com/questions/35162385/how-to-add-javacard-packages-to-javacard-applet/35178787#35178787.

现在我想使用sayHello()我的小程序中我的图书馆的方法:

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


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

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

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


请注意,实现的对象之间存在一些差异Shareable库包中的接口和静态方法。Shareable接口可用于通过防火墙从上下文 B 访问上下文 A 中的对象实例。但是,static可以从任何上下文访问方法 - 不适用防火墙规则。有一个很好的概述Applet隔离和对象共享在这里 http://pfa12.free.fr/doc_java/javacard_specifications/specs/jcre/html/JCRESpec06firewall.html。最重要的一段static方法是6.1.6:

类的实例(对象)由上下文拥有;类本身不是。访问类静态字段时,无法执行运行时上下文检查。调用静态方法时也不存在上下文切换。

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

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

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

简而言之:静态库中没有静态对象=没有Shareable needed.


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

您需要通用 Java 中的库的类文件jar文件来由 Java 编译器构建新的类文件。然后,您需要 Java Card Converter 的一些额外信息来将您的代码与库类及其方法链接起来。就是这样exp文件用于.这exp文件描述了所有公共组件的接口和依赖关系cap文件。 Eclipse JCOP 工具创建exp文件连同cap文件位于同一文件夹中,Java Card Converter 也是如此。 (请参阅 Oracle 的文档 http://www.oracle.com/technetwork/java/embedded/javacard/documentation/applet-136808.html#expfl)

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

请随意询问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建和使用Java Card库包? 的相关文章

  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐