关于java:Java的这个强大功能很多人都不知道

摘要:大多数框架采纳繁多的语言所开发。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办法,失去如下输入后果。

功败垂成~~

点击关注,第一工夫理解华为云陈腐技术~

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理