2012-03-23 7 views
0

私は現在、組み込みdevie(POS端末)上で動作するJavaアプリケーションを作成しています。 このデバイスには、manufacter固有の仮想マシンがあります。JNIを使​​用せずにJavaからネイティブ関数を呼び出す(スタック操作を使用)

ハードウェアとやり取りする機能は、この仮想マシン内のCのファイル(プロファイルAFAIK内)に定義されています。

正式な文書によると、仮想マシンはJNIもKNIもサポートしていないため、CとJavaコードのインタフェース方法として「スタック操作」しかサポートしていないため、これらの関数を自分のJavaコードから呼び出すことはできません。

私が見る限り、ネイティブ関数の引数はスタックを使って渡されます。関数を呼び出す前に引数をプッシュし、関数内にポップします(プロトタイプには引数がありません)。 私は関数を呼び出すために、多分コールスタックに関連する何かのような何かを推測する?

実際の質問は、「スタック操作」を使用してCとJavaをどのようにインターフェイスするのですか?

UPDATE:呼び出される関数の例(Cコード)デバイスの画面にメッセージを表示します。

void PrintAt(void) 
{ 
    Array msg = popStackAsType(Array); 
    int y = popStack(); 
    int x = popStack(); 
    NativePrint(x,y,msg->bdata); 
} 
+0

サンプルを提供していますか?私は1つを見ることに興味があるだろう。 manufacterは誰ですか、デバイスのモデルは何ですか? – Java42

+0

私は1つ見つけようとしましたが、残念ながらそこには何もありません – user363834

+0

ネイティブ関数プロトタイプの1つの例を挙げてください。それに付随する説明は何ですか? –

答えて

3

スタックを制御できないため、実際にはこれを行うことはできません。 JVMはスタックを制御し、いわゆるスタック操作は邪魔になりません。 JNIなどがなければ、おそらく別のプロセスでCコードを実行し、何らかの形のIPCを使用して通信することが最善の解決策です。

+0

答えてくれてありがとう、ドキュメントは明白に「スタック操作」と言います。もしJavaスタックに触れられないなら、それはCスタックですか?また、使用している仮想マシンはjvmでもkvmでもなく、manufacterのものですスタックの変更に関する異なる規則を持つ可能性があります。 IPCメソッドは良い代替ソリューションかもしれませんが、私は最後のリソースとして残します。 – user363834

+0

現在のアプローチを追求したい場合は、VMを深く理解する必要があるため、ベンダーの助けが必要です。私はIPCのために今行くつもりです。それは、遠く離れた最も簡単で簡単な解決策になるでしょう。 –

1

"プロトタイプには引数がありません"と言われているので、呼び出すことができるJavaネイティブメソッドがあると仮定していますが、スタックの先頭要素を実際に消費せずに引数として使用します。このような何か:

class Native { 
    native static void doSomething() { 
     // do something with stack[sp] as an int and stack[sp - 1] as 
     // an object reference, but do not modify sp. 
    } 
} 

あなたは生のバイトコードを書いた場合は、あなただけのポップそして、invokestaticを行い、その後、引数をプッシュすることができます。あなたはそれがJavaのように見えることを行うための方法をしたい場合は、私はこれが機能するはずだと思う:

class Dummy { 
    static void doSomething(int a, Object b) { 
     Native.doSomething(); 
    } 
} 
その後

abはすでにDummy.doSomething()への呼び出しからスタックになり、そしてネイティブで検査することができ方法。

編集:

は、あなたが本当に引数が内部のネイティブ関数をポップされていることを意味しますか?その場合、からいずれかの Javaコードまたはバイトコードが呼び出されるべきではありません。バイトコードベリファイアでは、関数を実行するすべての実行パスが開始時のサイズと同じサイズになることをチェックします。スタックを直接変更するネイティブコードの隠れたポップを知りません。

+0

スタックの最上位の要素を使って関数を処理するのは正しいですが、呼び出す関数は仮想マシンファイル内のCコードです。これらの関数の中で、popstackは異なる引数を取り出すために使われます。 – user363834

+0

メインポストに関数の例を追加しましたが、スタックを変更するかどうかはわかりません。 – user363834

関連する問題