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 支付宝

支付宝