jni在windows下和linux下的使用
一,在windows下生成dll動態連結庫:
java檔案:
public class JniEg { //native 檔案,只需宣告不需要實現 public native void display(); public native double sum(double x,double y); //static 靜態程式碼塊兒載入本地類庫 static { System.loadLibrary("hello");//動態連結庫的名字 } public static void main(String args[]) { //System.out.println("Hello,world!"); new JniEg().display(); System.out.println(new JniEg().sum(10.1,10.2)); } }
用native關鍵字,說明方法display和sum用的是本地方法(非java)方法,這裡用c實現display和sum:
首先將JniEg編譯成.h檔案:
1,編譯JniEg為class檔案 JniEg.class
2,用命令javah jniEg編譯為標頭檔案JniEg.h
JniEg.h檔案為自動生成,如下:
然後實現方法display和sum/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JniEg */ #ifndef _Included_JniEg #define _Included_JniEg #ifdef __cplusplus extern "C" { #endif /* * Class: JniEg * Method: display * Signature: ()V */ JNIEXPORT void JNICALL Java_JniEg_display (JNIEnv *, jobject); /* * Class: JniEg * Method: sum * Signature: (DD)D */ JNIEXPORT jdouble JNICALL Java_JniEg_sum (JNIEnv *, jobject, jdouble, jdouble); #ifdef __cplusplus } #endif #endif
hello.c檔案如下:
然後編譯為dll庫:#include <jni.h> #include "JniEg.h" #include <stdio.h> #include <stdlib.h> JNIEXPORT void JNICALL Java_JniEg_display(JNIEnv *env, jobject obj) { printf("Hello,World!\n"); return; } JNIEXPORT jdouble JNICALL Java_JniEg_sum(JNIEnv *env, jobject obj, jdouble a, jdouble b) { return a + b; }
用命令(用的是Mingw):
gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -Id:/java/include –Id:/java/include/win32 -shared -o hello.dll
hello.c
用-Wl,--kill-at因為mingw預設是用@來進行分隔,會導致JNI機制不能讀取,所以要刪掉..
將生產的dll檔案放到eclipse的專案根目錄裡面,注意java找sum和display是用的類名找的,所以hello.dll只能被JniEg類來呼叫
編譯執行。
二,在linux下生產.so庫
java檔案同上,生成.h檔案同上,hello.c檔案同上,不同的地方是在linux中的動態連結庫的生成
1,首先要注意的第一點是,linux中預設的動態連結庫的名字是lib開頭的,也就是說,如果這裡寫的是System.loadLibrary(“hello”);則動態連結庫的名字必須是:
libhello.so檔案
2,在生成libhello.so檔案時的命令:gcc -I/usr/java/jdk1.7.0/include -I/usr/java/jdk1.7.0/include/linux -o libhello.so -O2 -fPIC -shared hello.c
解釋一下:-fPIC引數宣告連結庫的程式碼段是可以共享的,-shared引數宣告編譯為共享庫
注意這裡如果要是編譯命令為:gcc -I/usr/java/jdk1.7.0/include -I/usr/java/jdk1.7.0/include/linux -o libhello.so -O2 -fPIC -shared -c hello.c
最後注意將生成的libhello.so檔案放到java預設查詢的地方/usr/lib裡面
或者用命令export LD_LIBRARY_PATH = .:$LD_LIBRARY_PATH