天天看點

JNI使用

對于如何使用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

繼續閱讀