読者です 読者をやめる 読者になる 読者になる

【Effective Java】項目54:ネイティブメソッドを注意して使用する

Effective Java Java

Java Native Interface (JNI) を使うと C/C++ などで書かれたネイティブメソッドを呼び出すことができます。

歴史的にネイティブメソッドには3つの用途がありました。

  1. レジストリ、ファイルロックなどのプラットフォーム固有機構へのアクセス
  2. 古いコードのライブラリへのアクセス
  3. パフォーマンスの改善

プラットフォーム固有機構にアクセスするためにネイティブメソッドを使うことは正当です。 ただし、Java が進化するにつれてこの機会は減ってきています。

例えば Java 1.4 ではレジストリにアクセスするための java.util.prefs が追加されました。 Java 1.6 ではシステムトレイにアクセスするための java.awt.SystemTray が追加されています。

パフォーマンスの改善

現在の Java でパフォーマンスを改善するためにネイティブメソッドを使用することは推奨されていません。 JVM 実装はかなり速くなっているので、ほとんどの場合ネイティブメソッドに頼る必要はありません。

たとえば以前、BigInteger はパフォーマンスのためにネイティブメソッドに頼って実装されていました。 しかし、現在ではさらにパフォーマンスのよい Java コードに書き換えられています。

ネイティブメソッドには安全ではないという重大な欠点があります。 メモリリークやメモリ破壊を起こす可能性があります。 また、ネイティブ言語はプラットフォーム固有ですので移植性がありません。

ネイティブコードの呼び出し自体に一定のオーバーヘッドが存在しますので、最悪の場合、パフォーマンスを悪くする場合もあります。