Jni接口

来源:互联网 发布:深圳淘宝培训班 编辑:程序博客网 时间:2024/05/16 07:29

一、基本概念

  Jni是Java Native Interface的英文缩写,意思是JAVA本地接口。通俗点的意思就是用JAVA调用C或者C++。在实际开发过程中很可能会使用到C或者C++开发的DLL,这个时候就需要用JAVA来调用DLL。

二、实现一个简单的Jni

  1、编写一个简单的JAVA类(Test.java)

  public class Test {

        public native void firstTest(); 

      public static void main(String[] args) {    

      }

  }

  这段代码中,使用native关键字来修饰 firstTest()方法。这个firstTest方法就是将要在C或者C++中实现的方法。

  2、获得.h头文件

  首先确保环境变量配置正确。编译Test.java类,我的项目目录是:E:\Java#project\Jni。然后在CMD下执行以下命令:

  

  命令运行成功后,会在E:\Java#project\Jni\bin目录下生成com_test01_Test.h文件。

  刚才使用javah命令是JDK自带的命令,就是用来生成.h文件的。如果想查看javah,请打开JDK目录:D:\Program Files\Java\jdk1.6.0_13\bin。

  3、编写C++.NET程序

  这里说明下 哈,本人不太会C++,所以这里就只能写C++.NET程序来测试下了。效果都是一样的。

  (1)打开VS2008,新建一个C++工程,如下图:

  

  (2)将com_test01_Test.h头文件引入到项目中

  

  将D:\Program Files\Java\jdk1.6.0_13\include下的jni.h文件 和 D:\Program Files\Java\jdk1.6.0_13\include\win32下的jni_md.h文件拷贝到项目根目录下,打开将com_test01_Test.h,将最上面的#include <jni.h>修改为#include "jni.h"。然后在源文件的Jni01.cpp中 引入com_test01_Test.h 并编项目,如下图所示:

  

  (3)在C++.net程序中实现Jni方法

   打开com_test01_Test.h文件,会看见如下代码:

  #include "jni.h" /* Header for class com_test01_Test */

  #ifndef _Included_com_test01_Test

  #define _Included_com_test01_Test

  #ifdef __cplusplus

  extern "C" {

     JNIEXPORT void JNICALL Java_com_test01_Test_firstTest   (JNIEnv *, jobject);

    #ifdef __cplusplus }

   #endif

  #endif

  其中JNIEXPORT void JNICALL Java_com_test01_Test_firstTest   (JNIEnv *, jobject); 就是第一步Test.java类中firstTest()方法在C++.net程序中的体现,下面将Java_com_test01_Test_firstTest这个方法在Jni01.cpp中实现一下,然后编译整个项目。Jni01.cpp的代码如下:

  #include "stdafx.h"

  #include "WINSCARD.H"

  #include "com_test01_Test.h" using namespace System;

  int main(array<System::String ^> ^args) {    

    Console::WriteLine(L"Hello World");    

    return 0;

  }

  //实现Java_com_test01_Test_firstTest方法

  JNIEXPORT void JNICALL Java_com_test01_Test_firstTest(JNIEnv *, jobject){  

    Console::WriteLine(L"第一个Jni小程序");

  }

  4、将Jni01.dll配置到环境变量中

  上一步操作编译完成后,打开项目文件,我的电脑上目录是:E:\C#project\Jni\Debug,找到Jni01.dll文件,这个文件就是最后得到的dll。为了JAVA程序运行时能找到这个DLL,所以要在环境变量上配置一下,找到环境变量中的”path“,打开如下图所示:

  

  将C++.net程序的项目debug文件夹路径E:\C#project\Jni\Debug 配置到环境变量。如图:

  

  5、在Java程序中测试一下。

  在第一步操作中的Test.java类的main方法中写如下测试代码:

  public static void main(String[] args) {   

    System.loadLibrary("Jni01");   

    new Test().firstTest();  

  }

  其中System.loadLibrary方法就是用来加载DLL文件的,参数名就是DLL文件的名字(注:本列中DLL文件是Jni01.dll,这里的参数只填写Jni01,没有后缀名)。

  运行Test.java,效果如下:

  

  

  以上就是用Jni实现Java调用C++的一个简单小程序,谢谢!