Java中的JNI调用

来源:互联网 发布:淘宝分销刷销量 编辑:程序博客网 时间:2024/05/18 20:07

Java的平台无关特性使得java语言具有write once , run everywhere的巨大优势。但是,java为了可以调用其他语言(C,C++等)的动态链接库,发挥其他语言的优势,java采用JNI机制使得开发者可以调用操作系统相关实现的库函数。 其中JNI的原理图如下:

 

下面以一个例子对JNI调用进行说明。

1.  在Eclipse下创建工程Test, 新建类JniTest,代码如下:

package learn.JNI;public class JniTest {static{System.loadLibrary("dllName");}public native static int getSquare(int a);/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(getSquare(5));}}

在代码中,首先写入static代码块,通过System.loadLibrary("dllName"); 导入dll文件(文件的生成在后面的步骤中)。然后创建native的static方法,作为调用C++函数的接口。下面的main入口就没什么好说的了,就是对java接口的测试。 


2. 采用Eclipse进行编译,或者直接用javac对文件进行编译,形成字节码。 

    javac learn/JNI/JniTest.java

    接着对生成的字节码文件使用javah命令,生成.h文件。

    javah learn.JNI.JniTest   该命令在src目录下生成文件learn_JNI_JniTest.h。 其代码如下:

    

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class learn_JNI_JniTest */#ifndef _Included_learn_JNI_JniTest#define _Included_learn_JNI_JniTest#ifdef __cplusplusextern "C" {#endif/* * Class:     learn_JNI_JniTest * Method:    getSquare * Signature: (I)I */JNIEXPORT jint JNICALL Java_learn_JNI_JniTest_getSquare  (JNIEnv *, jclass, jint);#ifdef __cplusplus}#endif#endif

可以看出,javah根据java文件中的native接口,生成了.h文件中的JNIEXPORT jint JNICALL Java_learn_JNI_JniTest_getSquare(JNIEnv *, jclass, jint)方法。


3. 在Visual Studio中建立dll工程,生成相应的dll文件。

新建工程-Visual C++-Win32-Win32 Project, 然后键入工程的名字,该名字要与第一步中的loadLibrary()中的名字一致。这里,我们就命名为dllName。在后面的选择中,分别选择DLL选项和empty project选项。


点击确定后,把刚才生成的learn_JNI_JniTest.h文件放在该工程目录下。并且需要复制jdk/include/jni.h  jdk/include/win32/jawt_md.h  jdk/include/win32/jni_md.h到Visual Studio的安装目录Microsoft Visual Studio 9.0\VC\include下。然后创建.cpp文件,其名字任意, 这里命名为cal_func.cpp,代码如下:

#include "learn_JNI_JniTest.h"JNIEXPORT jint JNICALL Java_learn_JNI_JniTest_getSquare(JNIEnv *jni_env, jclass obj, jint a){return a*a;}

即为对.h中的函数接口的实现。

这样就可以对工程直接进行编译,最终在Debug下可以发现dllName.dll动态链接库文件。


4. 把生成的dllName.dll文件放在java工程的根目录下,这样直接运行java程序,就可以看到结果了。


0 0
原创粉丝点击