標籤:
好吧,開始我的第一個JNI實驗小程式
HelloWorld.java 代碼清單
1 public class HelloWorld { 2 3 static { 4 System.loadLibrary("HelloWorld"); 5 } 6 7 public static native void hello(String msg); 8 9 10 public static void main(String args[]){11 HelloWorld hw = new HelloWorld();12 hw.Display();13 }14 15 void Display(){16 System.out.println("hello,world");17 }18 19 }
記得檔案名稱必須和類名一致,編譯
javac HelloWorld
利用 javah 命令產生c 的標頭檔,命令形式 javah <packagename>.<classname>,因為我沒有定義包名,所以直接是類名:
javah HelloWorld
這樣在目錄下將會產生以包名為檔案名稱的標頭檔 HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: hello * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_HelloWorld_hello (JNIEnv *, jclass, jstring);#ifdef __cplusplus}#endif#endif
下面我們需要建立HeloWorld的動態共用程式庫,先建立一個HelloWorld.c, 然後將標頭檔中的函數定義拷貝過來,並且指定參數的變數名
#include "HelloWorld.h"JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv * env, jclass jz, jstring s){}
這是個毫無用處的函數,在java程式中我們也只有聲明,沒有調用,現在我只是實驗他是否能正常裝載。用 gcc 命令進行編譯
淺試 JNI編程