zoukankan      html  css  js  c++  java
  • JNI的方式调用DLL(SO)(上)

          最近有个项目要调用原有的DLL文件,本来准备使用JNA,可是客户不同意,非要使用JNI的方式。万般无奈之下,只能重新使用JNI,现将JAVA调用动态链接库的一般方法总结如下。

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

          使用JNI调用DLL文件的步骤一般有以下几步:

             1、编写带有native声明的方法的java类

             2、使用javac命令编译所编写的java类

             3、使用javah命令编译成头文件 

             4、使用C/C++实现本地方法(包含第3步生成的头文件)

             5、将C/C++编写的文件生成动态连接库

          下面将通过实例详细介绍上面5步的具体实现

    –> 编写带有native声明的方法的java类,代码如下:

    View Code
     1 package com.wanggc.jni;
     2 
     3 public class MyJniNativeMethods {
     4     /**
     5      * 取最大值。
     6      * 
     7      * @param data1
     8      *            数据1
     9      * @param data2
    10      *            数据2
    11      * @return
    12      */
    13     public native int getMaxData(int data1, int data2);
    14 
    15     /**
    16      * 向某人问好。
    17      * 
    18      * @param name
    19      *            人名
    20      * @return
    21      */
    22     public native String getGreeting(String name);
    23 
    24     /**
    25      * 加载动态链接库
    26      */
    27     static {
    28         System.loadLibrary("testJni");
    29     }
    30 
    31     /**
    32      * 入口主函数。
    33      * 
    34      * @param args
    35      */
    36     public static void main(String[] args) {
    37         MyJniNativeMethods jniTest = new MyJniNativeMethods();
    38         // 调用第一个本地方法得到两个数中的最大值
    39         int maxData = jniTest.getMaxData(100, 150);
    40         System.out.println(maxData);
    41 
    42         // 调用第二个本地方法想某人问好
    43         String hello = jniTest.getGreeting("王国成");
    44         System.out.println(hello);
    45     }
    46 }

          13行和22行包含了两个本地方法,getMaxData和getGreeting,注意本地方法只需有方法名,不需要方法体。需要使用native关键字修饰。27-29行用于加载动态链接库。注意DLL文件不要后缀,只要名称就可以了。

    –> 使用javac命令编译所编写的java类,如果是用eclipse编写的代码,不须使用此命令,使用project菜单的clean选项编译一下就可以了。

    –> 使用javah命令编译成头文件 

         编译好class文件后,打开CMD窗口,转到bin目录,运行

    作者:孤旅者
    如果您对本文有意见或者建议,欢迎留言,哪怕是拍砖(^_^)!
    欢迎转载,请注明出处!
    感谢您的阅读,请关注后续博客!
    共享视频教程请访问:JAVA 高级软件工程师视频
  • 相关阅读:
    Eclipse建立Java工程中的三个JRE选项的区别(Use an execution environment JRE,Use a project specific JRE,Use default JRE)
    Maven项目报错:Missing artifact****和ArtifactDescriptorException: Failed to read artifact descriptor for***和Cannot change version of project facet Dynamic web module to 2.5
    使用jdk的keytool 生成CA证书的方法
    Linux shell逐行读取文件的方法
    ArrayList的实现原理
    时间复杂度总结
    RPC的原理总结
    hashcode和equals方法的区别和联系
    消息队列的应用场景总结
    Java中IO流中的装饰设计模式(BufferReader的原理)
  • 原文地址:https://www.cnblogs.com/gulvzhe/p/2476460.html
Copyright © 2011-2022 走看看