對于如何使用JNI的初衷是因為看jdk源碼時看到有native關鍵字,由于對這個關鍵字很陌生,就查了下,原來是Java調用C/C++寫的動态庫檔案時才使用到的,是以便學習了下,使用方法如下:
native用法:用native修飾的方法表示,該方法的實作不是在目前檔案,而是用其它語言(如:C/C++)實作,java語言不能對作業系統底層進行操作和通路,是以需要使用JNI接口調用
實作示例:
package com.summary;
public class JNITest {
public native void hello();
static{
System.loadLibrary("JNITest");
}
public static void main(String[] args){
new JNITest().hello();
// System.out.println(System.getProperty("java.library.path"));
}
}
編譯:
1、先建立編譯後檔案存放目錄:out/com/summary/, out和src目錄同級,如下:
--JNITest
--src
--com
--summary
JNITest.java
--out
--com
--summary
JNITest.class
2、cmd到JacobTest目錄下,執行:
javac -d ../out com/summary/JNITest.java
3、cmd到out目錄下,執行指令生成供C/C++調用.h檔案:
javah -jni com.summary.JNITest
此時可以看到,out目錄下生成了一個com_summary_JNITest.h的頭檔案,不要修改該檔案,将此檔案作為需要實作OCRSpecialFilm方法的C/C++ 工程使用;
4、用vs建立C++類型為class library的工程,将jdk安裝目錄下的include目錄下的jni_md.h和jni.h以及生成的com_summary_JNITest.h頭檔案拷貝至C++工程下,
在C++檔案中實作com_summary_JNITest.h中聲明的方法,如下:
//JNITest.cpp中實作
// This is the main DLL file.
#include "stdafx.h"
#include "JNITest.h"
#include "com_summary_JNITest.h"
#include "jni.h"
#include "jni_md.h"
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_com_summary_JNITest_hello(JNIEnv *, jobject) {
cout<<"hello world jni test"<<endl;
}
5、編譯工程,生成JNITest.dll檔案,将該檔案拷貝至java類加載目錄(如不清楚,可以使用System.out.println(System.getProperty("java.library.path"));列印出相應目錄),
再到java工程下運作程式,在控制台列印輸出
hello world jni test