2015-11-26 5 views
5

私は基本的に管理されたネイティブコードとそのdifferenceという考えを理解しています。しかし、彼らが互いに通信することは技術的にどのように可能ですか?次の例を想像してみてください。混合コード(ネイティブ、管理対象):どのように(技術的に)相互運用できますか?

特定のプラットフォーム向けにコンパイルされた静的または動的なC++ライブラリがあります。今、私はJava Programmを書いています。このコードでは、ライブラリ関数を 'native'キーワードで呼び出します。私は、バイトコードでjarファイルを構築し、C++ライブラリファイルは別々のままです。結果はプラットフォームに依存しなくなりました。

  1. しかし呼ばれるネイティブメソッドが存在する場合、どのようにJavaのプログラムの開発を知っていますか?

  2. 実行時にプログラムコード全体がどのように実行されますか?私は、バイトコードがJITで解釈またはコンパイルされることを知っています。

  3. これはどのようにしてサンドボックスのパラダイムに適合しますか?ネイティブコードもサンドボックス内で実行されていますか?

  4. (javaとC++の両方のコードが最終的にマシンコードなので動作しますか?

多分これは疑問な質問です。しかし、私はいつも不思議だった...

編集:私は3良い答えを得た。本当に私を助けたのは本当に決めることができません。しかし、私は私の側からこのトピックを閉じるために、この質問に回答としてマークします。

答えて

2
  1. メソッドを呼び出すまではわかりません。ネイティブコードは.DLLまたは.soにあります。 Javaランタイムは、作成したネイティブメソッドに対応する特定のエントリポイントを探します(JNIを使​​用している場合は、メソッドを解析し、コンパイル時にそのエントリポイントになる関数スタブを作成するツールがあります)。必要なエントリポイントが存在しない場合、例外がスローされます。

  2. JITによって生成されたコードは完全に自己完結型ではありません。外部ネイティブコード(低レベルのランタイムルーチンまたはOSサービスの両方)を時々呼び出す必要があります。ネイティブメソッドのコードを呼び出すのにも同じメカニズムが使用されます。

  3. いいえ純粋なC/C++プログラムでやることは、すべてここで行うことができます。あなたが(ログイン特権制限、他のOS保護、セキュリティソフトウェアなど)あなたが持っている外部セキュリティ対策ですが、VMがあなたを守ることはありません。

  4. いいえ、JNIはJITが登場する前であっても存在しませんでした。このメカニズムは同じですが、バイトコードがインタプリタによって実行されていて、このインタプリタにネイティブコードを呼び込ませたい場合は、特定のメソッドが「外部」でありネイティブコード。この情報はコンパイルされた.classファイルに含まれており、インタプリタまたはJITがそれを読み込むと、メソッドの参照時に呼び出しを容易にするメモリ表現が作成されます。

1

プラットフォームによって異なります。 Linux、Solarisなどでは、JREはdlopenを使用します。 Windowsでは、LoadLibraryExGetProcAddressを使用します。 JREが解釈モードで実行されている場合、JREはその関数を呼び出します。コンパイルモードでは、Javaバイトコードをその関数を呼び出すネイティブコードにコンパイルします。

私がよく知っているすべてのJREで、静的ライブラリでネイティブ関数を直接呼び出すことはできません。ダイナミックライブラリの1つだけです。

ネイティブコードは単一のプラットフォームに限定する必要はありません。標準Cの場合は、JREが利用可能なすべてのプラットフォームでクロスコンパイラを使用してコンパイルできます。

1
  1. JVMを使用すると、定義されたライブラリをチェックして、方法があるかどうかを確認しますが

  2. バイトコードを解釈またはJITコンパイルとネイティブコードへの呼び出しが追加されます。これには、データを適切な形式に変換するために必要なボクシング/デボイジング値やその他のものが含まれます。ライブラリには、Javaコンパイラに説明されている特定のインタフェースがあり、必要なインタフェースロジックを生成します。

  3. サンドボックスによって異なります。デフォルトでネイティブコードはネイティブコードです。 Java APIを呼び出すことはないので、JVMはそれを管理できません。しかし、JVMがサンドボックス化を提供するライブラリを使ってネイティブコードを実行したり、オペレーティングシステムにサンドボックス化の方法があるなど、他の制限があるかもしれません。

  4. これは意味によって異なります。最終的にコンピュータが行うのはマシンコードですが、この場合は実際には問題になりません。重要なことは、翻訳と実行の部分です。それがすべてを機能させる接着剤です。

システムを人と考えてください。 Aさんは日本語のみ話していますが、パリでホテルを予約したいと思っています。受付係Bはフランス語のみを話します。人物Aはコマンドをフランス語のコマンド受付係Bに翻訳する翻訳者を得ることができ、その代わりにBが生成したものをA人が理解できる形に翻訳する。これがJNIの部分です。

関連する問題