如何使用JNI,實現Java本地編程

1 JNI是什麼?

Java Native Interface ,Java本地接口。它允許Java語言與其他語言編寫的應用進行交互。JNI是本地編程接口,它使得Java VM內部運行的代碼,能夠與其他編程語言(比如 C\C++ 、彙編)編寫的應用程序和庫進行交互操作。關於JNI的具體說明文檔,請查看:
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html

2 使用JNI實現Java本地調用

步驟:
1 編寫包含本地方法的java程序;
2 使用javah生成頭文件;
3 根據生成的頭文件,實現本地方法;
4 編譯成動態庫文件;
5 使用,編寫一個測試類。
下面是具體實現過程:
編寫.java文件,下面我將1步和第5步寫成了一個類 ,包括本地方法聲明和加載動態庫:

HelloWorld.java
public class HelloWorld{
    public native int printNum();//本地方法聲明
    static{
        System.loadLibrary("libHelloWorld");//加載動態庫
    }

    public static void main(String[] args){
        new HelloWorld().printNum();//調用本地方法

    }
}

使用javac 命令編譯,生成HelloWorld.class文件。
利用HelloWorld.class生成頭文件,要想生成頭文件,必須安裝好JDK(當然,上一步假設你已經安裝好!),
javah –classpath 包的上一級目錄(一定要是這個) –jni 包名.類名
可以使用javah –help 來獲取命令使用的方法
由於我這個並未指定包名,故直接:
javah -classpath HelloWorld.class -jni HelloWorld
生成的頭文件:
HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> //包含文件,必須包含jni.h 它位於JDK的include目錄中,是自動生成的
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld   //預處理命令 如果後面的常量未定義,則返回true,執行後面的代碼
#define _Included_HelloWorld  //定義宏
#ifdef __cplusplus //如果後面的常量已被定義,返回true ,執行後面的代碼
extern "C" { 
#endif 
/*
 * Class:     HelloWorld
 * Method:    printNum
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_HelloWorld_printNum
  (JNIEnv *, jobject); //本地方法原型,JNIEXPORT JNICALL都是宏名 ,jint 是返回的類型 ,Java_HelloWorld_printNum本地方法名,Java_全類名(用_隔開)_方法名,參數JNIEnv JNI環境變量, jobject java對象 注意此處只做了聲明,並未指明形參,實現時要注意

#ifdef __cplusplus
}
#endif
#endif

實現具體的C文件:

HelloWorld.c
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"

JNIEXPORT jint JNICALL Java_HelloWorld_printNum
  (JNIEnv *env, jobject obj){//本地方法的具體實現
printf("HelloWorld");


}

編譯C文件,爲了獲得編譯器,我下載了Dev c++工具,好處,我也可以使用它了編寫C程序。然後配置環境變量,或切換目錄到安裝的bin目錄下(在DOS環境中),使用命令:
gcc -c -I”E:/Java/jdk1.8.0_20/include” -I”E:/Java/jdk1.8.0_20/include/win32” -LD HelloWorld.c -FeHelloWorld.dll
以上得到.o中間文件。接着編譯爲so文件
gcc -o libHelloWorld.dll -shared -fPIC HelloWorld.o
然後使用java HelloWorld運行程序輸出,如下:
JNI輸出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章