初识JNI

来源:互联网 发布:sql 遍历查询结果 编辑:程序博客网 时间:2024/05/02 18:30

前几天很高兴有机会在讲台上讲JNI的知识,虽然网上有很多关于JNI的知识,但只有自己动手去做了,才能感受到它的魅力所在。现在我将自己掌握的知识跟大家分享:

 

一.jni介绍

       JNI( Java Native Interface)Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现.

       标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的

       你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的

       程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们

.使用步骤:

1.编写java类,在类中声明一个native关键字的方法。

          如:public native void say();

        2.java类编译成字节码文件(*.class     

        3.使用javah命令生成包含native方法定义的c/c++头文件

        4.VC++中新建一个DLL工程,在工程中添加三个c头文件:jni.h,               jni_md.h, 和上面生成的头文件。按照生成的c/c++头文件来写c/c++ 

        5.编译源文件,生成DLL文件

        6.dll放入java工程中,采用System.loadLibrary()方法,调用该DLL

.一个简单的例子:

1.编写java代码

     我们在硬盘上建立一个hello工程作为我们的工作目录,新建一个pack包,在包下面建Test类。首先我们需要编写自己的java代码在java代码中我们会声明native方法,代码非常简单。如下所示

class Test

{

    public native void getResult(int x,int y);

    public static void main(String[] args) {

    }

}

  2.保存该类,就在工程的bin目录下生成了pack.Test.class文件

  3.使用javah命令:javah  pack.Test

      生成c头文件:pack_Test .h

    声明的方法为:

JNIEXPORT void JNICALL Java_pack_Test _getResult (JNIEnv *, jobject,jint,jint);

4.新建win32 DLL工程mydll,添加三个头文件后,写代码实现方法

#include<stdio.h>

#include”pack_HelloWorld.h”

   JNIEXPORT void JNICALL Java_pack_Test_getResult(JNIEnv * env, jobject o,jint x,jint y)

   {

        return(x+y);

   }

5.编译,然后按F7生成DLL文件,在mydll工程debug文件夹中有mydll.dll

6.mydll.dll复制到java工程根目录下,再在HelloWorld类中调用该DLL

 class HelloWorld

{

    public native  int getResult(int x,int y);

    public static void main(String[] args) {

        System.loadLibrary(“mydll”);

        Test  h=new Test ();

       System.out.println( h.getResult(3,5));

    }

}

 运行程序,结果为: 8     

 

 

原创粉丝点击