0%

用JNI調用C或C++動態聯接庫入門

用JNI調用C或C++動態聯接庫入門

HelloWorld.java:

1
2
3
4
5
6
7
8
9
10
11
package ocr;

public class HelloWorld {

public native void displayHelloWorld();// ①


static{
System.loadLibrary("HelloWorld");// ②
}
}

TestDLL.java:

1
2
3
4
5
6
7
8
9
10
public class TestDLL {

public static void main(String[] args){

HelloWorld helloWorld = new HelloWorld();

helloWorld.displayHelloWorld();

}
}

說明:
①是java本地方法申明;

②裝入動態鏈接庫,”HelloWorld”是要裝入的動態鏈接庫名稱。

注:動態庫鏈接位置設置,放在system32下面或者將dll所在文件夾設置為系統環境變量

假如,動態庫HelloWorld.dll是存在的話,上面的用法是OK的!

假如,動態庫 HelloWorld.dll不存在的話,則先將java文件編譯成.class文件,然后在將class轉成.h文件,然后c++在把那個.h文件引入進來,操作如下:

打開CMD:
1、編譯成class文件:

1
javac HelloWorld.java

2、轉成h文件:

1
javah ocr.HelloWorld

ocr_HelloWorld.h文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ocr_HelloWorld */

#ifndef _Included_ocr_HelloWorld
#define _Included_ocr_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ocr_HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_ocr_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

在新建一個HelloWorld.cpp,將其.cpp編譯成dll文件,若有需要額外頭文件,請到jdk安裝目錄下面include文件夾獲取相關,如:C:\Program Files (x86)\Java\jdk1.5.0_22\include:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include "ocr_HelloWorld.h" //引用進來

JNIEXPORT void Java_ocr_HelloWorld_displayHelloWorld(JNIEnv *, jobject)
{
printf("Hello World!\n");
return;
}
#endif
layicr 微信支付

微信支付

layicr 支付寶

支付寶