[英]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.