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目录,运行

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建推荐系统所需要的材料

搭建推荐系统所需要的材料人力物力推荐系统的原材料物品流量最后人力物力 在上一小节中《推荐系统的必要性》里已经讨论过一个推荐业务团队需要哪些人员储备,需要什么核心技术等。这里在重点说下物力,即机器资源设备。 往往从头开始搭建这样一个团队&a…

kafka:topic为什么要进行分区?副本机制是如何做的?

kafka为什么要在topic里加入分区的概念?如果没有分区,topic中的segment消息写满后,直接给订阅者不是也可以吗? Kafka可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如…

将某字符串切割成阵列并排序列出

老师布置的另外一道题是将字符串"a;b;d;z;y;u"切割成阵列并排序列出。老师出这题也许是让Insus.NET掌握或复习Array.Sort()函数,不管怎样,先按自己的想法实现,然后是等老师的意见。protected void Page_Load(object sender, EventA…

Kafka史上最详细原理总结

原文链接:Kafka史上最详细原理总结_我是Alvin家鸡鸭鱼的小米米-CSDN博客_kafka史上最详细原理总结

关于管理,这5大误区你越早知道越好

关于管理,这5大误区你越早知道越好 原创: 陈春花 管理的常识 绝大部分人都感觉自己已经非常努力地工作,但结果却不尽如人意,到底问题出在哪里? 就让北京大学国家发展研究院管理学教授、北大国发院BiMBA商学院院长陈春…

大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Log存储解析

Kafka 工作流程 Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic的。 topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partition 对应于一个 log 文件,该 log…

IIS上配置运行cgi,php,aspx运行环境

1、配置PHP程序运行环境: 把PHP解释程序安装到C:\php目录下,然后把此目录下的php4ts.dll文件复制到c:\windows\system32目录下。接着把PHP目录下的 php.ini.dist文件改名为php.ini,并编辑此文件,找到register_globals off这一项修…

推荐系统整体框架概览

推荐系统整体框架概览推荐系统整体架构 推荐系统的核心组成部分离线核心节点服务UI总结推荐系统整体架构 先说点题外话,最近在看的书中讲到了怎么进行自学的方法,分了十个层级。第一个便是要了解所学内容的概况,也就是轮廓,大的东…

大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Kafka 生产者

3.2.1 分区策略 1)分区的原因 (1)方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器,而一个 topic又可以有多个 Partition 组成,因此整个集群就可以适应任意大小的数据了; &a…

大学(转载)

1. 别怕丢人,追求丢人是一种成功的尝试,至于为此笑话你的人,你可以把他们从你将来人生对手的名单中排除了,你也要为每一位上台唱歌的人鼓掌。2、你有足够的理由佩服每天早起的人,不信的话,你去做。做到后会…

自燃型员工的特点

自燃型员工的特点原文:https://mp.weixin.qq.com/s/SaQ_GG7CpPqdGc_l5jffag 稻盛和夫曾经说过,人分为三种: 一种是自燃型,自我驱动,自我燃烧; 第二种是点燃型,需要别人在背后推一把;…

MySQL定时备份实现

一、备份数据库 –all-databases 备份所有数据库 /opt/mysqlcopy/all_$(date “%Y-%m-%d %H:%M:%S”).sql 备份地址 docker exec -it 容器名称 sh -c "mysqldump -u root -ppassword --all-databases > /opt/mysqlcopy/all_$(date "%Y-%m-%d %H:%M:%S").sq…

POJ 1159 (DP)

题目:http://poj.org/problem?id1159 思路: 找出原串的最长回文子串,当然这里说的回文子串可以不连续。用原串的长度减去最长回文子串的长度即可得出结果。 设原串a[5001],它的反串为b[5001],求出a和b的最长公共子串的长度(可以不连续&#…

新版本ISR 为啥 移除replica.lag.max.messages这个参数

ISR 上节我们涉及到ISR (In-Sync Replicas),这个是指副本同步队列。副本数对Kafka的吞吐率是有一定的影响,但极大的增强了可用性。默认情况下Kafka的replica数量为1,即每个partition都有一个唯一的leader,为了确保消息的可靠性&am…

程序员健身的重要性

程序员健身的重要性人的身体就是人的灵魂最好的写照! --- 路德维系.维特根斯坦 健身不仅是保持健康体魄的关键要素之一,也是灵活的、具有创造性的脑力活动的基础。 --- 约翰.肯尼迪 …

Java 8 中的哈希表

JDK 的代码是开源的,我们打开idea开发工具,引入jdk1.8 找到hashmap HashMap 是基于 HashTable 的一种数据结构,在普通哈希表的基础上,它支持多线程操作以及空的 key 和 value。 在 HashMap 中定义了几个常量: static final in…

NSJSONSerialization介绍

ios5中apple增加了解析JSON的api——NSJSONSerialization。网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON、TouchJSON、YAJL、JSONKit、NextiveJson。详情见这里。既然apple为我们提供了这么良好的工具,我们没理由不用吧。 NSJSONSeriali…

开始新的blog之旅--flash3,0涂鸦板保存,撤销功能

一直以来都是在百度写的博客,今天不知道百度是哪抽风。居然把我的博客给封了,上贴吧去发泄一番,结果帖子都给删了。 不得不说你百度厉害,你自己犯的错误。让我们这些用户跟着受罪。我看今天很多博客都被封了,都不知道原…

JDK8HashMap的扩容核心解读,尾插法

看懂了JDK7Hashmap的扩容头插法,及其可能产生的循环引用问题,今天看看JDK8的HashMap扩容实现。采取的是用四个结点,两条链表完成重新分配位置,比较简单有趣。解析如下: //如果原来的table等于null,直接返回…

领导者的资质——学习笔记(1)

领导者的资质——学习笔记(1)《领导者的资质》是稻盛和夫先生著作的一本书,书中的道理值得深深思考和体会,结合自己工作、生活中的一些事情,会有不同的感觉。本学习笔记特此记录书中重点的内容,供以后反复阅…