私は、APDUコマンドを処理するためのいくつかの一時的なオブジェクトが必要です(Javaのカード2.2.1用)は、Javaカードのアプレットに取り組んでいます。私は、正しいメモリ管理についての質問を持っています。私が問題に研究に多くの時間を費やしてきたが、私はいくつかのJavaカードAPIのいずれかの明確化や優れたサンプルコードを発見したノーところ。私は2つの主要な質問があります:
どのように私は一時的なオブジェクト(RAMでないEEPROMでI平均カスタムオブジェクト)の配列を作成することができます。私は読んしている
makeTransientObjectArray
が、それはObject型の配列のみを返します。私が使用して、例えば過渡バイト配列を作成する方法を知っているmakeTransientByteArray
が、私の問題は、オブジェクトインスタンスの過渡的な配列についてです。または直列化せずにインスタンスへのキャストのバイト配列に、Java言語のいずれかの方法かもしれませんか?私は、着信APDUコマンドの処理中にオブジェクトのこの過渡的な配列を必要としない私のために割り当てられたメモリを維持する必要があります。この一過性メモリ(内部割り当てするのに最適な場所はどこにあり
install
、select
、process
、...の関数は)?
以上の説明のために編集:
私はすでにドキュメンテーションから読んでてきたように、任意のオブジェクトのインスタンスは、EEPROMに格納されます。私は私の処理アルゴリズムに必要となるオブジェクトの最大数を知っていると(100と言います)。私は内部のメソッドをインストールするのMyClassの100個のインスタンスを生成します。フィールド1短い、フィールド2、Aバイト、およびFIELD3短いタイプ:MyClassのの各インスタンスは、3つのフィールドが含まれています。これらのすべての100個のインスタンスは、APDUコマンドの入力によって入力されます。各コマンドの場合、それらは一時的なデータであるため、私はEEPROM、そのことをお勧め、上のオブジェクトを埋めます。また、EEPROMは、最大wiritingサイクルを持っています。アプローチは、インスタンスごとに、私は使用して各オブジェクトの5つのバイトを割り当てることであってもよい
makeTransientByteArray
とmakeTransientShortArray
。有効ではない-私はドキュメンテーションから読み込まれているようしかし、それは(ないように注意してくださいサイズ32バイトの)クラスターによってメモリを割り当てます。それでは、私は、このシナリオで行う必要がありますか?私は一時記憶のために何をすべきかを意味します。内部の機能をインストールする過渡メモリを割り当てる場合、それは他のアプレットでは使用できません。アプレットがカード上の唯一のアプレットであれば、内のすべての過渡的なメモリを割り当てることをお勧めし
install
機能。私はすべての条件(単一のアプレットデバイスまたはマルチアプレットデバイス)のための一般的な効果的な方法を知りたいです。また、私はわからない、過渡メモリは内部を割り当てた場合はinstall
、カードをカードリーダーに挿入されるたびに、内部の処理機能利用できるようになります。
残念ながら、何をやろうとしていると、Javaカードの古典的な仕様では不可能です。すでに自分に気づいたように、オブジェクトのインスタンスは常に、EEPROMに格納されています。だから、問題を回避する必要があります。
Javaは、オブジェクトが常にメモリの特定の部分に格納され、比較的高いレベルの言語です。今、彼らは、Java Cardの持続性メモリにメモリの種類を変更しました。しかし、それはオブジェクトがメモリまたは他のいずれかのタイプで構築することができるようにするために、言語の完全な再設計が必要となります。今日ではJCFはもちろん、そのために注釈を使用して検討することもでき - それはまだ非常にトリッキーが、おそらくなんとかなります。
同様に、オブジェクトが一つの処理方法ではなく、さらに、アレイ・タイプでのみ生きる持ってすることはできません。これを実装するには、どちらか持っているほかのヒープやリアルタイムのガベージコレクタを持っている必要があります。これは、1つのヒープと互いに向かって成長し、スタック、およびGCはどちらか現在の古典的な実装に存在するものではありませんリアルタイムに管理するために十分に懸命です。ここでは、非常に制限された環境で作業しています。
だから、基本的には、プラットフォームの制限を回避する必要があります。
使用するための一つの良い戦略は、一時メモリまたは参照既存のメモリ含むオブジェクトのキャッシュを作成することですなAPDUバッファ内のメモリなどを。オブジェクトは、インストールやパーソナライゼーション中に作成されます。これらのオブジェクトは、使用時に必要に応じて、取得してキャッシュに戻すことができます。あなたのアイデアを与えるために、Javaのを見て取りByteBuffer.wrap()
、既存のアレイの一部にバッファ操作を実行することを可能にする方法を。今、その型の再利用可能なオブジェクトを検討します。
他の論理的な解決策は、すべてのオブジェクト指向プログラミングを使用することではありません。ねえ、OOは全て素晴らしく、ダンディですが、私たちはここに8〜10 KiBのRAMの持つチップの話をしている最大値を。制限があります。どのようなオブジェクトで行うことができますが、一般的にもちょうどな方法で行うことができます(実際には、あなたがこのオブジェクトなしでJavaのように、ケースであることを証明することができます間違いなく完全な-チューリングが、あなたのデザインで、あなたしているがスタックした場合、それは少し慰めのですされます) 。
テキスト上の注意:
- いいえ、あなたがオブジェクトインスタンスにバイト配列をキャストすることはできません。これは、一般的にJavaおよびオブジェクト指向のすべての原則を行くだろう。それが可能である場合には、データのカプセル化を含むすべてが壊れてしまいます。あなたはもちろん、自分自身をデシリアライズし、(上記の戦略を参照)キャッシュからオブジェクトに結果を置くことができます。
- メモリは、一般的にだけで怠惰なインスタンス化を使用して発行した後、非常におそらく一度インストールやパーソナライゼーション時に割り当てられた、またはされなければなりません。
- あなたは100個のライブオブジェクトを必要としません。あなたは唯一の特定の時間に「生きている」である必要があり、いくつかのオブジェクトを持っています。その情報の利用を作ろう!
- メモリの割り当ては、プラットフォームの実装に固有のものです。小さい「クラスタ」サイズのプラットフォームは間違いなくあります。プラットフォームは、一般的に試みるとなりますALIGNそれは同様のシステム/チップの設計に依存して、メモリ内のデータ。
- 使用して作成されたメモリは、
CLEAR_ON_DESELECT
他のアプレットに利用できます。それらが選択されている場合、このRAMは、すべての後にもう必要ありません。スマート実装は(まだトリッキーな、ちょっと)ヒープの上にそのメモリを続けるだろう。示されるように、これは、インスタンスの選択の後に利用可能になります。processメソッドは呼び出されます後アプレットが(でも最初のSELECT APDU自体を処理するために)選択されています。