什么是JNI,这里不做介绍,不懂的百度一下,这里直接动手写一个JNI入门案例。
前提:电脑上有vc++6.0,eclipse,
第一步:首先写一个java类,该类中要定义有naive方法,加载该native方法。案例代码如下:
package com.jni.demo;
public class HelloWorld {
static{
//静态块中加载本地DLL
System.loadLibrary("helloJNI");
}
public static void main(String[] args) {
sayHello();
}
//定义JNI方法
public static native void sayHello();
}
第二步:使用java的javah命令生产.h文件。
我的这个项目名就叫JNI,所以我的这个HelloWorld类的class文件所在的绝对路径为:
D:\Workspace\JNI\bin\com\jni\demo\HelloWorld
我们要生成.h文件,有几种情况要注意:
1.在早些博客中,说是生成.h文件,要在bin目录下,执行>javah com.jni.demo.HelloWorld。
倒是我尝试了很多次,都说是无法找到Hellowrold类,即便我就在HellowWorld.class文件所在
的目录下执行也不行。
2.也许是系统差异吧,我用的是win10,早些博客可能用的是win7或则xp不一样。在win10上执行,要加 -classpath 绝对路径。
不管你是在哪一级目录下,都要用绝对路径。如下:
上图命令是在bin目录下执行的,生成的文件就在bin目录下。
上图是在根目录下执行的命令,生成的文件就在根目录下。
第三步:制作dll动态链接库文件
1.要在vc++里新建win32 Dynamic-Link Librayy
工程名必须是和java中加载的动态库文件名一致。上面java代码System.loadLibrary(“helloJNI”);
其中的参数指的就是动态库的名字,也就是说java项目下要有一个helloJNI.dll文件。
点击确定
完成后可看见工作空间有已创建好的项目
2.装入jni.h和jni_md.h 两个头文件,这两个文件是需要引入的。
2.1 打开jdk的include目录 (我的目录是:C:\Program Files (x86)\Java\jdk1.7.0_45\include)
2.2 jni_md.h文件在win32文件夹中
把这两个文件拷贝出来放到我们刚建的c项目的工程下,还有我们javah 生成的那个HelloWorld文件。
3.回到C项目中,选择文件视图
3.1 展开工程项目,右击头文件,选择添加文件到目录
3.2 将刚才那三个文件引入
4.编写 C文件,实现方法
先切换到类视图
4.1 右击项目,选择 new class…
在弹出的窗口中,随便添入一个名字。
确定后选择文件视图,
点击source file下 我们新建的app文件
4.2 引入头文件
引入两个.h文件,再引入stdio.h头文件,该文件是c的基本类库。
4.3 编写c程序
双击打开com_jni_demo_HelloWorld.h文件。
复制 JNIEXPORT void JNICALL Java_com_jni_demo_HelloWorld_sayHello
(JNIEnv *, jclass);定义到HelloWorld.cpp中,并编写一句输出语句,如下图:
4.4 因为编译该文件,会调用到一些jdk中的dll,需要把jdk的路径引入。
我们选择:工具(菜单)-> 选项 –> 目录。
点击空白处,选择 jdk 中jni.h 和jni_md.h 两个文件的路径:
即:
C:\Program Files (x86)\Java\jdk1.7.0_45\include
C:\Program Files (x86)\Java\jdk1.7.0_45\include\win32
点击确定
4.5 生成dll文件
点击build(组建) 选择-> 编译,控制台会输出
0 error 就表示没有错误
再点击build(组建) 选择->组建。
出现以上信息表示组建成功。
第四步:调用dll动态库
第三步结束后,自制的动态库已生成,在C工程目录的Debug文件夹中。
我们将helloJNI.dll复制到我们的java项目下。
运行我们的项目,结果如下: