最近有个项目要调用原有的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目录,运行

转载于:https://www.cnblogs.com/gulvzhe/archive/2012/04/29/2476460.html

JNI的方式调用DLL(SO)(上)相关推荐

  1. VS2015采用loadlibrary方式调用dll库

    参考: //blog.csdn.net/luoyu510183/article/details/93666808 //blog.csdn.net/SonnAdolf/article/details/8 ...

  2. ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约

    ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约 目录 1.Geth安装.配置文件.与ETH节点交互 1.1.下载并安装好geth客户端 1.2. ...

  3. Qtum量子链QIP-5提案:在智能合约交易输出脚本上增加签名证明,允许用户以代付方式调用合约

    ​摘 要 Qtum量子链的主要目标之一是建立基于权益共识机制(PoS).并支持 UTXO 的智能合约模型.在智能合约层面上,Qtum 量子链兼容比特币 UTXO 模型和符合 AAL 规范的虚拟机,其中 ...

  4. java jni dll路径_Java中Jni调用DLL文件试验

    Java中Jni调用DLL文件试验 下面是小编整理的Java中Jni调用DLL文件试验内容,希望可以为您带来帮助!更多内容请关注应届毕业生考试网! 所有文件均在E:\路径下. 安装jdk1.6.0_0 ...

  5. Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)

    前言 关于Android Studio如何继承JNI开发环境,请阅读上一篇博文 Android CMake集成JNI开发环境本篇博文将结合实例分别讲解Android中Java如何调用C/C++的方法, ...

  6. AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)...

    使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...

  7. C++中调用DLL中的函数的两种方式

    一.DLL源文件: extern "C" __declspec(dllexport) int add(int a, int b) {return a + b; } 二.静态调用: ...

  8. java中通过JNA调用dll

    ---恢复内容开始--- 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进 ...

  9. android jni java调用c,Android与JNI(一) ---- Java调用C 静态调用

    第一.通过eclipse新建一个工程名为HelloJni的android工程,并编译. 第二.右键工程-->Android Tools --> Add Native Support,出现如 ...

最新文章

  1. 19倍超音速“大炮”轰出可控核聚变!成本仅为传统方法0.1%,腾讯已投资
  2. rabbitMQ(二):Fanout Exchange
  3. linux安装mysql5.7.19
  4. Java中StringBuilder的清空方法比較
  5. 广西高考成绩查询2021,2021年广西高考个人排名怎么查询,广西高考成绩排名查询方法...
  6. java生成UUID通用唯一识别码
  7. sys/queue.h分析(图片复制不过来,查看原文)
  8. IntelliJ IDEA 对于generated source的处理
  9. 大学计算机基础python第二次作业_第二次python作业-titanic数据练习
  10. Spring深入理解-Spring框架设计理念
  11. python 图像的拉普拉斯变换中的数值问题_数字图像处理(第十章)
  12. All xxx functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
  13. python机器学习案例系列教程——关联分析(Apriori、FP-growth)
  14. Android基础学习整理知识点
  15. C语言C++,dirent自创ddir结构体,实现更便捷的文件夹操作
  16. 维基百科英文语料库下载地址
  17. python批量检索文献pubmed_Python 利用Entrez库筛选下载PubMed文献摘要的示例
  18. VBA 贴片电阻名称转换
  19. jupyter中markdown模式编辑文本格式
  20. 凹凸手游服务器维护中是什么意思,凹凸世界手游测试炸服补偿公告介绍 开服进不去有什么补偿[多图]...

热门文章

  1. (并查集)Find them, Catch them
  2. python中方法调用方法_Python中实现结构相似的函数调用方法
  3. HTML+CSS+JS实现 ❤️酷炫的canvas全屏背景动画特效❤️
  4. layui下拉框的高度_LAYUI select 下拉框得高度
  5. 云服务器怎么管理,第一次使用云服务器,如何使用和管理云服务器
  6. 手机电脑自适应导航源码php,自适应各终端懒人网址导航源码 v2.0
  7. java 判断顺序_通过指令码来判断Java代码的执行顺序(++问题与return和finally的问题)...
  8. Dev C++ 实现Hello World
  9. ios 画线平滑_iOS 画贝塞尔曲线 连续曲线 平滑曲线 曲线图表
  10. php中reset函数,PHP reset()函数