Java使用JNI调用第三方dll动态链接库

  项目中应用到java调用第三方dll的问题,于是搜寻资料学习了一下;本文仅流于如何使用的层面,未对更深层次实现做探究。

 

  使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob.

  其中JNI(Java Native Interface)是Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的机器上调用不同的本地库。

  

  JNI

  JNI是Java Native Interface的缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。 

      使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。
  
  1. 创建一个类
  2. 使用javac编译该类

  3. 使用javah -jni产生头文件

  4. 用本地代码实现头文件中定义的方法,将编译生成的dll文件及lib文件复制到java类所在目录中

  5. Run

 
  示例:  
  1.创建Test1.java 
  
class Test1{                            
  static{       
    System.loadLibrary("MyDLL");     
  }         
  public native int getSum(int a, int b);    
  public native void displayResult(int c);        
  
  public static void main(String[] args){        
    int a = 1;        
    int b = 5;        
    int c = 0;        
    Test1 test1 = new Test1();        
    c = test1.getSum(a,b);       
    test1.displayResult(c);    
  }
}
2.进入该类所在目录,javac Test1.java    
3.javah Test1 生成Test1.h。注:-jni是默认参数,可不写。内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test1 */

#ifndef _Included_Test1
#define _Included_Test1
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Test1
 * Method:    getSum
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_Test1_getSum
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     Test1
 * Method:    displayResult
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_Test1_displayResult
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

  4.将jdk安装路径下 三个文件复制到 Visual Studio.net的安装目录下的\Vc7\include目录中  
  注:版本不同,可自己找到相应目录即可
  \jdk\include\jni.h 
  \include\win32\jawt_md.h
  \jdk\include\win32\jni_md.h
  打开VC++,新建一个DLL工程,选择空项目,命名为MyDLL。
  将Test1.h添加到项目Header Files下。
  新建Test1.cpp,根据Test1.h实现相应函数。内容如下

    #include<jni.h>
    #include"Test1.h"
    #include<stdio.h>

    JNIEXPORT jint JNICALL Java_Test1_getSum(JNIEnv *, jobject, jint a, jint b){
       jint c = a + b;
       return c;
    }

    JNIEXPORT void JNICALL Java_Test1_displayResult(JNIEnv *, jobject, jint c){
       printf("%d\n",c);
       return;
    }

   编译生成MyDLL.dll及MyDLL.lib,将其复制到Test1.java所在目录中

  5.dos下 java Test1  

  本文部分内容参考:

 
 
原文地址:https://www.cnblogs.com/captains/p/2268922.html