zoukankan      html  css  js  c++  java
  • 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  

      本文部分内容参考:

     
     
  • 相关阅读:
    nginx各版本全自动编译安装脚本
    kubernetes里面有时候centos源用不了
    centons6升级gcc和glibc版本
    容器下载的是centos8的镜像,scp出现packet_write_wait: Connection to **** port 22: Broken pipe 问题解决
    MNIST数据集手写体识别(MLP实现)
    BP 算法手动实现
    Python直接调用C库的printf()函数打印一条消息
    C/C++与Python实现混编(详细注释)
    MNIST数据集手写体数据还原为图片
    TensorFlow初识(MNIST数据集识别手写体)
  • 原文地址:https://www.cnblogs.com/captains/p/2268922.html
Copyright © 2011-2022 走看看