当前位置:首页 > 科技  > 软件

我敢说:99.9%的程序员根本没在项目中使用过Java的这个功能!

来源: 责编: 时间:2024-02-05 09:32:48 311观看
导读在Java语言出现之前,很多系统都是使用C和C++开发的。Java出现之后,由于其面向对象的思想更加符合人们的思维习惯,Java也不用像C和C++那样需要程序员手动管理内存的分配和回收。说白了,就是简单好用。由于Java的诸多优点,使

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

Wle28资讯网——每日最新资讯28at.com

为了能够和使用C和C++写的程序进行交互,Java提供了本地方法的特性,也就是我们常说的JNI技术,然而,随着互联网的高速发展,分布式、微服务、大数据、云计算等技术和框架层出不穷,大多数支持多语言的框架基本上都是都过RPC或者Restful API进行调用。JNI这项Java中提供的强大功能,却逐渐的被人遗忘了。Wle28资讯网——每日最新资讯28at.com

图片图片Wle28资讯网——每日最新资讯28at.com

为何使用JNI

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

Wle28资讯网——每日最新资讯28at.com

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

注:后面单独写一篇我是如何分析500多TB数据的。Wle28资讯网——每日最新资讯28at.com

如何使用JNI

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

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

图片图片Wle28资讯网——每日最新资讯28at.com

注意:本文中我使用的是jna Java类库实现JNI开发。Wle28资讯网——每日最新资讯28at.com

开发dll动态链接库

使用VS开发dll

VS新建项目

图片图片Wle28资讯网——每日最新资讯28at.com

输入项目名称

图片图片Wle28资讯网——每日最新资讯28at.com

选择空项目,点击完成Wle28资讯网——每日最新资讯28at.com

图片图片Wle28资讯网——每日最新资讯28at.com

图片图片Wle28资讯网——每日最新资讯28at.com

图片图片Wle28资讯网——每日最新资讯28at.com

创建完成后,将下面这段代码复制进去:Wle28资讯网——每日最新资讯28at.com

#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不是乱码就是调用失败。Wle28资讯网——每日最新资讯28at.com

使用VS生成dll

这里变成Release,点击配置管理器配置x64版本,这样生成的dll就是x64版本的,这点非常重要。Wle28资讯网——每日最新资讯28at.com

图片图片Wle28资讯网——每日最新资讯28at.com

Wle28资讯网——每日最新资讯28at.com

图片图片Wle28资讯网——每日最新资讯28at.com

配置完成以后右击项目点击生成按钮。Wle28资讯网——每日最新资讯28at.com

图片图片Wle28资讯网——每日最新资讯28at.com

这一顿操作下来,基本就能够正确的生成dll了,如果不能生成,极有可能是你的姿势不对,照着文章重新弄一遍,如果还是不行,你就加我微信(hacker_binghe)问我吧。Wle28资讯网——每日最新资讯28at.com

VS生成的dll文件在哪个位置呢?别急,我们继续。Wle28资讯网——每日最新资讯28at.com

右击项目

图片图片Wle28资讯网——每日最新资讯28at.com

这里要注意的是在上级目录!不要想当然打开的项目位置然后直接就去x64去找了,根本没用!里面没有dll,是在上级目录,上级目录 的x64位置。Wle28资讯网——每日最新资讯28at.com

图片Wle28资讯网——每日最新资讯28at.com

Wle28资讯网——每日最新资讯28at.com

图片Wle28资讯网——每日最新资讯28at.com

Wle28资讯网——每日最新资讯28at.com

开发Java程序

导入Maven依赖

新建Maven项目后,在Maven的pom文件中引入如下依赖。Wle28资讯网——每日最新资讯28at.com

<!-- 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包下面,这样导入这个包的时候可以写绝对路径也可以写相对路径。Wle28资讯网——每日最新资讯28at.com

Wle28资讯网——每日最新资讯28at.com

编写代码

注意:这里定义的接口方法名称需要和dll中的方法名称一致。Wle28资讯网——每日最新资讯28at.com

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方法,得到如下输出结果。Wle28资讯网——每日最新资讯28at.com

Wle28资讯网——每日最新资讯28at.com

Wle28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-73794-0.html我敢说:99.9%的程序员根本没在项目中使用过Java的这个功能!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 基于Mathlive将数学公式编辑器集成到可视化搭建平台

下一篇: Vue 10 岁了!你知道它最初的名字吗?

标签:
  • 热门焦点
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
Top