java linux so

3305 ワード

1.gccコンパイラがインストールされていることを確認する
2.HelloJNIを作成する.JAvaコードは、nativeでCで実現する必要がある関数を宣言します.ソースプログラムがパッケージに含まれている場合は、/home/swan/test/net/wangliping/HelloJNIなどの同じフォルダ構造を構築する必要があります.java

package net.wangliping

public class HelloJNI {     static     {

        System.loadLibrary("goodluck");     }

    public native static int get();     public native static void set(int i);

    public static void main(String[] args)     {         HelloJNI test = new HelloJNI();         test.set(10);         System.out.println(test.get());     } }


3.ハローJNIでJAvaファイルが存在するディレクトリの下でコンパイルする.JAvaファイル.
javac HelloJNI.java
4.~/desktopでコンパイル第3ステップで生成する.classファイルは、対応するものを生成する.hヘッダファイル、本例で生成したヘッダファイル名net_wangliping_HelloJNI.h
javah net.wangliping.HelloJNI
5.HelloJNIを作成する.cファイルは、参照ステップ4で生成する.hヘッダファイルは、宣言された方法を実装する.

#include "net_wangliping_HelloJNI.h"

int i = 0;

JNIEXPORT jint JNICALL Java_net_wangliping_HelloJNI_get(JNIEnv *env, jclass jc) {     return i; }

JNIEXPORT void JNICALL Java_net_wangliping_HelloJNI_set(JNIEnv *env, jclass jc, jint j) {     i = j; }


6.ステップ5で記述するHelloJNI.cファイル、コンパイル.oファイル
gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux -c HelloJNI.c
注:/usr/lib/jvm/java-1.5.00-sun-1.5.0.19/includeはjniです.hヘッダファイルが存在するパス/usr/lib/jvm/java-1.5.00-sun-1.5.0.19/include/linuxはjni_md.hが存在する経路
7.ステップ6で生成するHelloJNI.oファイルをコンパイルする.soライブラリファイル
gcc -shared HelloJNI.o -o libgoodluck.so
注意:windowsとは異なり、linuxのライブラリファイルはlibxxxでなければなりません.so形式コマンドの(またはlibxxx.so.y,yはバージョン番号)、lib接頭辞はシステムがそれを認識するためであり、xxxはjavaコードSystemである.loadLibrary("xxx");に表示されます.
8.ステップ7で生成するlibgoodluck.soファイルjavaのロードライブラリLD_にコピーLIBRARY_PATHが指す経路の中.前提はあなたが十分な権限を持っていることです.sudo権限のない学生は、以下の方法で:1)/homeの下で保存するために作成します.soライブラリファイルのディレクトリ、例えば/home/swan/lib 2)libgoodluck.soファイルをこのディレクトリにコピーする3)Terminalを開き、次のコマンドを実行する
export LD_LIBRARY_PATH=/home/swan/lib
現在のshellでのみ有効...
本ブロガーはろうそくを回して補足します:以下の方法は絶対経路を直接利用してこのsoライブラリファイルをloadすることができて、それによって上述のpathを置くかあるいはライブラリ経路を変更する動作をする必要はありません.
static {
    System.load("/home/swan/test/libgoodluck.so");
}

9.HelloJNIを実行しています.class
java net.wangliping.HelloJNI
すべてが正常になると、実行結果は10を出力し、その値はC言語コードによって実現され、返されることがわかります.
原文転載:http://www.linuxidc.com/Linux/2010-08/27602.htm