簡體   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