JNI入门之HelloWorld篇
1. JNI的作用
JNI(Java Native Interface)提供了一种java与C/C++ 代码进行交互的方式,可以通过java方法调用C/C++ 的实现,和已有的C/C++ 库。
2. JNI使用方法
- 首先在java类中声明native方法,与一般的函数声明类似,只是多了个native关键字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package com.hello.jni;
public class HelloJNI {
static {
System.loadLibrary("hello"); // Load native library at runtime
// hello.dll (Windows) or libhello.so (Unixes)
}
// Declare a native method sayHello() that receives nothing and returns void
private native void sayHello();
// Test Driver
public static void main(String[] args) {
new HelloJNI().sayHello(); // invoke the native method
}
} - 使用javah命令生成相应的头文件(到elipse工程的bin目录下,打开命令行,注意不用带class后缀)
javah com.hello.jni.HelloJNI
这时在bin目录下会生成对应的头文件com_hello_jni_HelloJNI.h1
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 */
/* Header for class com_hello_jni_HelloJNI */
extern "C" {
/*
* Class: com_hello_jni_HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_hello_jni_HelloJNI_sayHello
(JNIEnv *, jobject);
} - 然后就是要去实现之前声明的native方法,这里我们使用Visual Studio新建一个dll工程,
这里需要将之前头文件所依赖的jni.h和jni_md.h所在的jdk目录添加到包含目录中,并将项目类型切换到与平台类型一致,否则会出现这样的不匹配错误
1 |
|
1 | Exception in thread "main" java.lang.UnsatisfiedLinkError: D:\Workspace\AppProject\MyProjects\Debug\hello.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform |
- 将生成的dll文件的路径添加到环境变量中,这样JAVA类就可以调用dll中的C实现方法了
Hello World