使用eclipse+DevC++完成JNI调用

来源:互联网 发布:linux 查看gcc版本 编辑:程序博客网 时间:2024/06/05 05:05

最近忙着完成一个简易的词法分析器,由于要求主体程序使用java,而词法分析使用的flex只能使用c,所以出现了使用JNI的需求。这个过程当然很容易,但是由于很久没做,导致手法生疏,出现了各种各样的问题,在百度上着实费了点时间,为了避免以后出现同样的问题,这次就姑且做个总结吧。

首先说明一下JNI是什么。JNI是Java Native Interface的缩写,作用就是使本来与平台无关的Java变的可以使用本地的函数,例如调用操作系统的API,主要还是针对c/c++的。

操作步骤:

1.使用eclipse新建工程,对于需要调用本地函数完成的功能,只创建函数原型,加上native关键字,如public native int add(int a,int b);无需实现,

接着函数原型使用如下语句:

static{        System.loadLibrary("testJNI");    }
我在Demo中写的测试java类如下:

package main;public class Test {public native int add(int a,int b);static{System.loadLibrary("testJNI");}}

还有一个主函数所在的类,那个就无所谓了。注意红色部分为第三部生成的dll文件名。

2.使用javah命令,这一步比较麻烦。无法使用IDE完成(我是不知道的,如果有人知道请告诉我),来到生成的class文件所在的bin目录,然后使用javah -jni 文件名,本人在这里遇到了一个小问题,由于我安装了新版本的jdk,在eclipse中使用的也是新版本,可是环境变量中设置的路径还没改,所以使用命令行时出现了错误,修正之后没问题了。操作之后会出现一个.h文件,名称为   包名_类名.h

3.然后打开devc++,新建一个dll工程,导入.h文件,新建一个c文件,在其中将.h文件引入,并将其中的函数实现。然后编译连接,就会生成一个.dll文件。本人在这一步遇到了两个问题,一个是找不到jni.h,这个问题只要把jdk安装目录下的include文件夹中的jni.h文件以及include\win32目录下的jawt_md.h和jni_md.h文件考入devc++安装目录下的include文件夹即可解决;第二个问题是连接错误,对于这个问题,本人先安装了mingw,这个在sourceforge可以找到,然后在Devc++中添加mingw的库,再设置其味优先查找即可。具体步骤为:

1)在Devc++中打开“工具->编译选项->目录->库”

2)新增mingw中的lib,然后将其位置上移

3)重新编译即可

4.将生成的dll文件导入eclipse的工程中,直接编译运行即可完成