Javaのヒント23:ネイティブメソッドを書く

Javaで1セットのコードを記述し、それをJavaランタイムを使用してすべてのシステムで実行できることは、Javaの主な強みの1つです。しかし、このプラットフォームの独立性には1つの重要な欠点があります。それは、膨大な量の既存のコードをどうするかということです。秘訣は、いわゆるネイティブメソッドインターフェイスを使用することです。

ネイティブメソッドを作成するには、CコードをJavaアプリケーションにインポートする必要があります。このヒントでは、ネイティブメソッドを作成し、Javaアプリケーションで使用するための基本的なレシピについて説明します。

ネイティブメソッドの涅槃への7つのステップネイティブメソッドを作成するためのステップは次のとおりです。

  • Javaコードを書く
  • Javaコードをコンパイルする
  • Cヘッダーの作成(.hファイル)
  • Cスタブファイルを作成する
  • Cコードを書く
  • 共有コードライブラリ(またはDLL)を作成する
  • アプリケーションを実行する

私たちの演習は、ネイティブメソッド内からコンソールにテキストを書き込むことです。この例の詳細は、Unixライクなシステム、特にLinuxを対象としています。他のプラットフォームでは詳細が異なるいくつかの点を指摘します。

Javaコードを書く

通常どおりにJavaコードを記述します。Javaコードでネイティブメソッドを使用するには、2つのことを行う必要があります。まず、使用するネイティブメソッドごとにネイティブメソッド宣言を記述します。これは、通常のJavaメソッドインターフェイスの宣言を作成するのと同じですが、次のようにネイティブキーワードを指定する必要があります。

public native void printText(); 

ジャンプする2番目のフープは、ネイティブコードライブラリを明示的にロードする必要があることです。(これは後で作成します。)これを行うには、ライブラリをクラス静的ブロックにロードします。

static {System.loadLibrary( "happy"); }

この例でこれらの要素をまとめるにHappy.javaは、次の内容で呼び出されるファイルを作成します。

クラスHappy {public native void printText(); static {System.loadLibrary( "happy"); / *クラス名の小文字に注意してください!* /} public static void main(String [] args){Happy happy = new Happy(); happy.printText(); }}

Javaコードをコンパイルする

Happy.javaファイルをコンパイルします。

%javac Happy.java 

Cヘッダーファイルを作成する

Cコードをネイティブメソッドとして使用できるようにするには、さまざまな魔法の呪文を利用できるようにする必要があります。javahJavaコンパイラの機能により、Happyクラスから必要な宣言などが生成されます。これHappy.hにより、Cコードに含めるファイルが作成されます。

%javah Happy 

Cスタブファイルを作成する

C ++トランスレータがC ++メソッドの名前に対して行うマングリングを彷彿とさせる方法で、Javaコンパイラにも同様の狂気があります。CコードをJavaランタイムシステムから呼び出すことができるように多くの面倒なコードを書かなければならないという苦痛を和らげるために、Javaコンパイラは必要なトランポリンコードを自動的に生成できます。

%javah -stubs Happy 

Cコードを書く

それでは、挨拶を印刷するための実際のコードを書いてみましょう。慣例により、このコードは、文字列「Imp」が追加されたJavaクラスにちなんで名付けられたファイルに配置されます。これにより、がHappyImp.c。以下をに配置しますHappyImp.c

#include&ltStubPreamble.h> / *標準のネイティブメソッドのもの。* / #include "Happy.h" / *以前に生成されました。* /#include&ltstdio.h> / *標準のCIOのもの。* / void Happy_printText(struct HH​​appy * this){puts( "Happy New Year !!!"); }

CコードをJavaとインターフェースする際には、無数の型を渡したり返したりする方法など、他の多くの側面が関係します。詳細については、JavaチュートリアルまたはHermetica Native Methods Paperを参照してください(URLについては「参考文献」セクションを参照してください)。

共有ライブラリを作成する

This section is the most system-dependent. It seems like every platform and each compiler/linker combination has a different method of creating and using shared libraries. For folks using any of the various Microsoft Windows platforms, check the documentation for your C compiler for the nitty-gritty details.

For you Linux folks, here's how to create a shared library using GCC. First, compile the C source files that we have already created. You have to tell the compiler where to find the Java native method support files, but the main trick here is that you have to explicitly tell the compiler to produce Position Independent Code:

% gcc -I/usr/local/java/include -I/usr/local/java/include/genunix -fPIC -c Happy.c HappyImp.c 

Now, create a shared library out of the resulting object (.o) files with the following magical incantation:

% gcc -shared -Wl,-soname,libhappy.so.1 -o libhappy.so.1.0 Happy.o HappyImp.o 

Copy the shared library file to the standard short name:

% cp libhappy.so.1.0 libhappy.so 

Finally, you may need to tell your dynamic linker where to find this new shared library file. Using the bash shell:

% export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH 

Execute the application

Run the Java application as usual:

% java Happy 

Well, that's all there is to it. Thanks to Tony Dering for passing on the Linux-specific incantations.

A quick design note

急いでそのすべてのレガシーコードのネイティブメソッドを作成する前に、既存のシステムを注意深く調べて、それらをJavaに接続するためのより良い方法があるかどうかを確認するように警告します。たとえば、Java Database Connectivity(JDBC)や、Javaからデータベースにアクセスするためのさらに高レベルのソリューションがあります。だから、あなたのバッグの中のすべてのトリックを見て、目前のプロジェクトにとって意味のあるものを使用してください。

このトピックの詳細

  • JavaSoftネイティブメソッドTuturial // www.javasoft.com / books / Series / Tutorial / native / implementing / index.html
  • Hermetica Native Methods Paper //www.hermetica.com/technologia/java/native/

このストーリー「Javaのヒント23:ネイティブメソッドの記述」は、もともとJavaWorldによって公開されました。