cap包 使用JCDK与IDEA实现Javacard应用调试

Javacard应用开发是一个相对较小的领域,由于其特殊的承载介质和应用领域的限制,相关内容在网络上相对较少。尤其是关于调试方面的内容更是稀缺,大多数开发者只能依靠官方文档进行摸索和使用。与普通的Java应用不同,Javacard应用运行在资源受限的嵌入式设备上,因此在调试时需要借助软仿或硬仿工具。目前比较知名的调试工具可能是IBM开发的JCOP插件,这是一款收费的Eclipse插件,但已经多年未更新。Javacard开发套件JCDK从3.0.5版本开始也提供了针对Eclipse的调试插件,之前提供的是针对NetBeans的插件。然而,作为习惯使用IDEA进行Java开发的开发者,我不想为了Javacard开发而转向Eclipse或NetBeans(主要是因为我习惯和喜欢IDEA的界面和风格)。幸运的是,JCDK还提供了与IDE无关的调试方法。本文将按照Java Card Development Kit User Guide Version 3.1.0u5中的教程,验证使用IDEA和JCDK Simulator进行Javacard应用调试的可行性。起初,我想尝试的是JCDK版本3.0.4,但由于资料有限,官方文档的描述也很模糊,我在操作过程中没有成功。因此,我尝试了更新的版本,3.0.5版本引入了新的调试机制,文档描述也更清晰(或者说更合乎逻辑,3.0.4的文档写的流程让人有些摸不着头脑,与日常开发和应用编写的流程有很大差异。如果有哪位高手能够成功运行,请留言告知)。3.1.0是Oracle官网发布的最新JCDK版本,其调试框架也继承了3.0.5的机制。JCDK 3.1.0与以前的版本不同之处在于将程序示例和调试相关的模拟器(Simulator)从中抽取出来,形成了Java Card Development Kit Simulator。与应用开发和编译构建相关的工具构成了Java Card Development Kit Tools。这两部分可以单独安装。为了验证JCDK提供的调试功能,我安装了这两部分。关于Javacard开发的相关内容在网络上非常有限,很难找到与调试相关的教程。因此,我决定自己撰写一篇。本文将从环境准备开始,介绍从项目搭建到运行调试的基本流程。

一、环境及配置准备

  1. 安装IDEA,建议安装最新版的Community Edition。您可以从JetBrains的官方网站下载。
  2. 安装JDK 11或OpenJDK 11,Javacard应用的编译需要使用JDK。JCDK的测试也是在这两个版本的JDK下进行的。您可以从Oracle的官方网站下载JDK 11。
  3. 安装ANT,ANT用于执行Javacard应用相关的编译和构建任务。您可以从Apache的官方网站下载ANT。
  4. 安装JCDK 3.1.0,您可以从Oracle的官方网站下载。

4.1 安装Java Card Development Kit Tools
这是开发、编译和构建Javacard应用所需的工具包。选择一个适合的路径进行安装,并配置相关的环境变量。您可以使用JCHOMETOOLS或JCCLASSICHOME作为文件路径的变量名,并在系统变量PATH中配置对应的bin目录。如果您想使用Simulator包中的示例程序,建议将变量名设置为JCHOMETOOLS。

4.2 安装Java Card Development Kit Simulator
如果您需要使用JCDK进行调试和测试工作,您需要安装Simulator。Simulator包中还包含了Eclipse插件。选择一个适合的路径进行安装,并配置相关的环境变量。您可以使用JCHOMESIMULATOR作为文件路径的变量名,并在系统变量PATH中配置对应的bin目录。

完成以上准备工作后,您的计算机就可以进行Javacard应用的开发和构建了。您可以在命令行窗口中验证环境变量的配置是否正确。

二、调试架构
JCDK 3.1.0的调试机制的架构如下图所示。可以看到,JCDK Simulator中与调试相关的主要组件是DebugProxy和Simulator。

Simulator也称为cref,它是JCDK Simulator包中提供的JCRE的参考实现(Reference Implementation)。使用cref可以模拟Javacard的运行环境,进行程序的验证和调试。从JCDK 3.0.5开始,cref引入了debug选项,可以在运行cref时指定命令行参数-debugPort,从而可以使用cref进行代码调试。

DebugProxy对应/lib目录下的jc-debug-proxy.jar,它实现了JDWP(Java Debug Wire Protocol)协议,从而可以与外部IDE进行调试通信。DebugProxy与IDE、Simulator之间通过sockets进行通信。在运行时,需要指定具体的通信端口。

结合这个架构,可以看到不同组件具有不同的职责。Simulator模拟Javacard的运行环境,相当于使用程序模拟的嵌入式硬件设备(如IC卡),并支持指定RAM、ROM等资源的数值。当我们需要进行代码调试时,将源码构建生成的cap包加载到Simulator中是理所当然的,因为后续应用的触发是通过APDU指令进行的,而cap包是执行应用相关APDU的前置条件。

DebugProxy负责与IDE和Simulator进行通信。因此,它的运行在Simulator之后,并且在运行时需要指定各自的通信端口以及调试使用的cap包的路径。在IDE上设置的断点信息也会在DebugProxy中反映出来。

我提到这一点是因为3.0.4版本的文档(包括之前的几个版本)描述得相当模糊,而且我自己也没有成功调试过。

三、项目创建
在了解调试机制的整体框架后,我们可以开始创建项目了。实际上,直接使用示例进行调试是最方便的。在这里,我创建了一个名为HelloWorld的普通Java项目。使用JDK 11,并创建了src目录和包路径。在包路径下创建了HelloWorld.java,并将示例程序中的代码复制粘贴过来。示例程序中的HelloWorld程序主要功能是返回C-APDU中的数据部分,结构相对简单,但包含了基本的Javacard要求实现的方法,适合用于验证调试功能。

将%JCHOMETOOLS%目录下的apiexportfiles目录复制到项目中。apiexportfiles文件夹中包含了构建cap包所需的中间文件(后缀为.exp)。

同时,将%JCHOMESIMULATOR%/samples/classicapplets目录下的buildcommon.xml、powerdown.scr、powerup.scr以及HelloWorld子目录下的helloworld.scr,HelloWorld/applet目录下的applet.opt(在新项目中重命名为HelloWorld.opt),build.xml复制到项目的根目录下。这些xml文件定义了编译、构建和生成安装脚本的相关ant任务,scr文件在生成安装脚本时会引用到,opt文件指定了构建cap包时使用的参数配置。

复制文件后,请确保在build.xml文件中更改相关文件的相对路径。此外,需要根据需要更改HelloWorld.opt中的配置,包括包名和AID,并添加-debug选项。可以参考Java Card Development Kit User Guide中相关参数的含义。

四、IDEA调试设置
IDEA的设置主要包括四个方面:配置依赖的jar包路径、编译设置(可选)、新增调试配置和新增ant任务。

进入File-Project Structure…-Project Settings-Modules-Dependencies界面,新增%JCHOMETOOLS%/lib目录,点击应用,以确保能够正常查看项目中的代码而不会出现错误。

如果使用IDEA中的Build选项,则需要进行编译相关的设置(建议直接运行ant任务)。进入File-Setting…-Build, Execution, Deployment-Compiler-Java Complier界面,勾选Generate debugging info,点击应用。

进入Run-Debug Configuration…界面,新建Configuration,类型选择Remote JVM Debug,配置名称、主机IP、通信端口和项目路径,点击应用。由于Simulator运行在本地,因此Host选项填写localhost,通信端口可以自定义。在这里,我使用了JCDK 3.0.4中DebugProxy默认的与IDE通信的端口。

点击View-Tool Windows-Ant以显示Ant选项,添加Ant任务,指定build.xml后,可以看到任务列表。选中任务目录,然后点击上方的Properties选项,切换到Execution栏,将Ant版本配置为1.9.x版本(建议)。

cap包cap包cap包cap包

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

cap包cap包cap包cap包cap包

赞(0)