摘要:大多数框架采用单一的语言所开发。JNI这项Java中提供的强大功能,却逐渐的被人遗忘了。

本文分享自华为云社区《Java中一个逐渐被遗忘的强大功能,强到你难以置信!!》,作者:冰 河。

在Java语言出现之前,很多系统都是使用C和C++开发的。Java出现之后,由于其面向对象的思想更加符合人们的思维习惯,Java也不用像C和C++那样需要程序员手动管理内存的分配和回收。说白了,就是简单好用。由于Java的诸多优点,使其一跃霸榜编程语言前排很多年。

为了能够和使用C和C++写的程序进行交互,Java提供了本地方法的特性,也就是我们常说的JNI技术,然而,随着互联网的高速发展,分布式、微服务、大数据、云计算等技术和框架层出不穷,但大多数框架采用单一的语言所开发。JNI这项Java中提供的强大功能,却逐渐的被人遗忘了。

为何使用JNI

最近,在分析了500多TB的数据,从500多TB的数据中分析用户的行为习惯,以便为用户提供更好的产品体验和推荐更加适合用户的产品。然而,在实现算法的过程中,使用Java语言开发的算法从500多TB的数据中,单独分析某个用户某段时间的行为时,耗费了极大的时间开销。无论我如何优化算法,都不能达到预期的效果。很显然,这不符合性能要求。

一名小伙伴对我说:试试C语言嘛。对啊!我为啥不试试用C语言写算法啊,于是乎,使用C语言写了算法,经过不断的优化和调整,算是初步达到了算法性能要求。但是向数据大屏展示数据的时候,后端还是要以微服务的形式部署,于是我想到了Java中的JNI技术

如何使用JNI

先说说使用JNI时有哪些坑吧,以避免小伙伴们重复踩坑,这里,大家需要注意的是:在使用JNI技术调用dll动态链接库时,32位dll只能是32位JDK去调用,64位dll只能是64位JDK去调用。这个必须是这样的,如果发现无法调用或者提示版本错误,首先要检查下JDK的位数和dll的位数是否是对应的。

为了能够让小伙伴们顺利的按照文章开发出自己的JNI程序,这里,我就详细的说下如何开发一个JNI程序,主要分三个大的方面来说明如何使用JNI技术调用C和C++写的程序。

注意:本文中我使用的是jna Java类库实现JNI开发。

开发dll动态链接库

下载VS

使用VS开发dll

VS新建项目

输入项目名称

选择空项目,点击完成

创建完成后,将下面这段代码复制进去:

#include <windows.h>
#include <iostream>
#include <string>
using std::string;
using std::cin;
using std::cout;
using std::endl; #define MYLIBAPI extern "C" __declspec( dllexport ) //这的参数是必须的,也可以定义为.c头文件
MYLIBAPI double add(double a,double b);
MYLIBAPI double mul(double a,double b);
MYLIBAPI char * getString(char* a); double add(double a,double b){
return a + b;
} double mul(double a,double b){
return a*b;
}
//定义了一个返回java String类型的参数
char * getString(char* a){
char* b ="this is test";
return strcat(a,b);
}

这里要注意的是:java的String和cpp的String不一样的,其对应的是char,如果要用cpp的string不是乱码就是调用失败。*

使用VS生成dll

这里变成Release,点击配置管理器配置x64版本,这样生成的dll就是x64版本的,这点非常重要。

配置完成以后右击项目点击生成按钮。

这一顿操作下来,基本就能够正确的生成dll了,如果不能生成,极有可能是你的姿势不对,照着文章重新弄一遍,如果还是不行,你就加我微信问我吧。

VS生成的dll文件在哪个位置呢?别急,我们继续。

右击项目

这里要注意的是在上级目录!不要想当然打开的项目位置然后直接就去x64去找了,根本没用!里面没有dll,是在上级目录,上级目录 的x64位置。

开发Java程序

导入Maven依赖

新建Maven项目后,在Maven的pom文件中引入如下依赖。

<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.3.1</version>
</dependency>

指定dll位置

我个人就放在这个lib包下面,这样导入这个包的时候可以写绝对路径也可以写相对路径。

编写代码

注意:这里定义的接口方法名称需要和dll中的方法名称一致。

package com.binghe.jni;

import com.sun.jna.Library;
import com.sun.jna.Native; /**
* @author binghe
* @description: 测试JNI程序
*/
public class JnaTest {
public interface TestProject extends Library {
TestProject INSTANCE = (TestProject) Native.load("src/main/lib/testDll.dll",
JnaTest.TestProject.class);
public double add(double i, double j);
public double mul(double i, double j);
public String getString(String a); } public static void main(String[] args) { System.out.println(TestProject.INSTANCE.add(20.11,20.0));
System.out.println(TestProject.INSTANCE.mul(16.9,20.89));
System.out.println(TestProject.INSTANCE.getString("我现在正在测试dllgihjb"));
}
}

运行Java程序

直接运行main方法,得到如下输出结果。

大功告成~~

点击关注,第一时间了解华为云新鲜技术~

Java的这个强大功能,很多人都不知道的更多相关文章

  1. 震惊!很多人都不知道 CSS Grid 框架早就有了!

    前言 写作本文起源于知乎的一个问题:[CSS Grid 布局那么好,为什么至今没有人开发出基于 Grid 布局的前端框架呢?] 这篇文章拖沓了两个月,是因为真的不知道从哪里说好.这个问题的所有回答几乎 ...

  2. [转帖](区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗?

    (区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗? http://baijiahao.baidu.com/s?id=1600948969290990883&wfr=spide ...

  3. 听说特斯拉花了4个月研发出新ERP,然后很多人都疯了

    欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 最近这件事儿在SAP圈里炒的挺火的,最主要是因为这几个关键词: 放弃SAP.4个月.自研ERP: 这则新闻一出来,很多人都兴高采烈,都要疯了 ...

  4. 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?

    今天群里有人聊图片上传,简单说下自己的经验(大牛勿喷) 0.如果你的方法里面是有指定路径的,记得一定要过滤../,比如你把 aa文件夹设置了权限,一些类似于exe,asp,php之类的文件不能执行,那 ...

  5. 很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)

    <西游记>中的唐僧团队历经千难万险,终于求得真经,目标明确.分工合理为这支队伍最终走向成功奠定了基础.唐僧从一开始,就为这个团队设定了西天取经的目标,虽然经历各种挫折与磨难,但目标从未动摇 ...

  6. 这个 Spring 循环依赖的坑,90% 以上的人都不知道

    1. 前言 这两天工作遇到了一个挺有意思的Spring循环依赖的问题,但是这个和以往遇到的循环依赖问题都不太一样,隐藏的相当隐蔽,网络上也很少看到有其他人遇到类似的问题.这里权且称他非典型Spring ...

  7. 很多人都搞不清楚C语言和C++的关系!今天我们来一探究竟为大家解惑~

    最近,身边有许多小伙伴已经开始学习编程了,但是呢,学习又会碰到许多的问题,其中作为新手小白提到最多的问题就是编程语言的选择. 每次遇到这种问题,看起来很简单,但是又有很多小伙伴搞不清编程语言之间的关系 ...

  8. 一道月薪3W的java面试题 (小明和小强都是张老师的学生,张老师的生日是某月某日,2人都不知道张老师的生日)

    小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日 是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗? 3月4日 3月5日 3 ...

  9. 7个现在就该学习Python 的理由【80%的人都不知道】

    Python 是一门更注重可读性和效率的语言,尤其是相较于 Java,PHP 以及 C++ 这样的语言,它的这两个优势让其在开发者中大受欢迎. 诚然,它有点老了,但仍是 80 后啊 —— 至少没有 C ...

  10. 原来现在很多人都用SignalR来实现Chat Room

    今天从一个业余开发的群里,看到有人要求这样一个项目需求: 1,)学员可以通过在线课堂找到自己喜欢的老师和课程. 2,)每个人可以建立自己课堂,每个课堂扣分多个子房间,交流群.设置管理员:有录音功能,可 ...

随机推荐

  1. Linux发行版部分时间线

  2. Python 潮流周刊#25:性能最快的代码格式化工具 Ruff!

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中一则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...

  3. 2007年对Youtube小视频的分析文章

    Understanding the Characteristics of Internet Short Video Sharing: YouTube as a Case Study 视频的种类 该研究 ...

  4. Electron原生菜单

    .markdown-body { color: rgba(56, 56, 56, 1); font-size: 15px; line-height: 30px; letter-spacing: 2px ...

  5. ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级

    ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级 1.ChatGLM3简介 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型.Chat ...

  6. FPGA与Simulink联合仿真环境搭建(硬件在环)

    硬件在环(HIL) \(\quad\)官方的一些定义:硬件在环 (HIL) 测试是一种实时仿真,让您无需使用系统硬件即可开始测试嵌入式代码.如果正在开发的代码未按照规范运行,您可以通过此项测试来发现可 ...

  7. 学生开发者勇担青年使命,用AI守护少数人的“视界”

    本文分享自华为云社区<[先锋开发者云上说]学生开发者勇担青年使命,用AI守护少数人的"视界">,作者:华为云社区精选 . 青年动人之处,在于他们的勇气,和非凡的创造探索 ...

  8. Windows_Cmd常用操作配置

    目录 特定功能执行命令 显示系统当前版本 电源管理 历史命令相关 显示路由表 显示本地 ARP 缓存 测试主机 联通性 查看网卡信息 修改DOS窗口中的编码格式 诊断域名系统 (DNS) 基础结构的信 ...

  9. 在路上---学习篇(一)Python 数据结构和算法 (5)二分查找、二叉树遍历

    独白: 利用算法进行查找指定元素,最近学习二分查找和二叉树遍历.二分查找前提是在有序中进行查找,二叉树引入了树的概念.树的概念其中有许多小知识点,也是一种新的数据结构.还是之前的感悟,需了解其本质才会 ...

  10. charles谷歌浏览器抓包方法

    charles谷歌浏览器抓包方法 在工作中,我们会在PC电脑上测试页面,查看后端接口,我们会选择浏览器F12的功能来查看后端请求的接口,那我们能不能用charles抓包工具去抓呢?下面简答介绍一下ch ...