JNI入门案例

什么是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项目下。

运行我们的项目,结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值