编译原理的词法分析是用c语言写的,由于语法分析想试试用树形结构显示出来,就想着用java去写语法分析,但是在不想再用java写一遍词法分析,于是我就决定用JNI来满足需求。
首先编写如下的java代码:
package lexical;
public class Test {
public native void Main();
static {
System.loadLibrary("ForMorPhologyOnx64");
}
public static void main(String [] args){
Test t = new Test();
t.Main();
}
}
然后在cmd里进入到D:\Workplace\compile\src\lexical目录,javac Test.java将其编译。
我的这个文件是在lexical包里的,所以退回上一层在cmd里输入javah -jni lexical.Test,这时看当前文件夹,里面就会有一个叫做lexical_Test.h的.h文件,里面的代码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class lexical_Test */
#ifndef _Included_lexical_Test
#define _Included_lexical_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: lexical_Test
* Method: Main
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_lexical_Test_Main
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
然后在你所用的c/c++ide里创建一个dll项目,把生成的lexical_Test.h文件放到该文件夹下。写一个c或者cpp文件,在该文件中引用lexical_Test.h头文件,并且把其中的
JNIEXPORT void JNICALL Java_lexical_Test_Main
(JNIEnv *, jobject)
方法按照你想要其实现的功能写出来。这个方法是要被java调用的,就是上面java代码里的Main()方法。
另外还需要jni.h,jni_md.h,jawt_md.h这三个头文件,这三个头文件在安装的jdk的include目录下面。把这三个头文件放到c/c++要用的ide的include目录下,然后选择生成文件,就可以生成dll文件了,该dll文件的文件名应该是dll项目名。把该dll文件放到jre的bin目录下,这样就可以供java调用了。