1
头图

Hello everyone, I am Glacier~~

Speaking of Java, it is simple and easy to use, but many

Before the advent of the Java language, many systems were developed using C and C++. After the advent of Java, because its object-oriented thinking is more in line with people's thinking habits, Java does not require programmers to manually manage memory allocation and recovery like C and C++. To put it bluntly, it is simple and easy to use. Due to the many advantages of Java, it has leapt to the top of the list of programming languages for many years.

In order to be able to interact with programs written in C and C++, Java provides the characteristics of native methods, which is what we often call JNI technology. However, with the rapid development of the Internet, distributed, microservices, big data, cloud computing Such technologies and frameworks emerge in endlessly, but most frameworks are developed in a single language. JNI, the powerful function provided in Java, is gradually forgotten.

Why use JNI

Recently, Glacier is analyzing more than 500 terabytes of data and analyzing user behavior habits from more than 500 terabytes of data in order to provide users with a better product experience and recommend products that are more suitable for users. However, in the process of realizing the algorithm, the algorithm developed using the Java language separately analyzed the behavior of a certain user for a certain period of time from more than 500 terabytes of data, which consumed a lot of time. No matter how I optimize the algorithm, I can't achieve the expected results. Obviously, this does not meet the performance requirements.

A small partner said to me: try the C language. correct! Why don't I try to write the algorithm in C language, so I wrote the algorithm in C language. After continuous optimization and adjustment, it can be regarded as preliminary to the algorithm performance requirements. But when displaying data to the big data screen, the backend still needs to be deployed in the form of microservices, so I thought of the JNI technology in Java

Note: I will write a separate article later on how I analyzed more than 500 terabytes of data.

How to use JNI

Let me talk about the pits when using JNI to avoid repeating the pits. Here, everyone needs to pay attention to: When using JNI technology to call dll dynamic link library, 32-bit dll can only be called by 32-bit JDK. , 64-bit dll can only be called by 64-bit JDK. This must be like this. If it is found that it cannot be called or the version is incorrect, first check whether the bit number of the JDK and the bit number of the dll correspond.

In order to allow the friends to develop their own JNI programs smoothly in accordance with the article, here, I will talk about how to develop a JNI program in detail, mainly divided into three major aspects to illustrate how to use JNI technology to call C and C++ written program.

Note: In this article, I use the jna Java class library to implement JNI development.

Develop dll dynamic link library

Download VS

Friends can reply to "vscode" on the [Glacier Technology] public account to get the VS2010 download link.

Use VS to develop dll

VS new project

Enter project name

Select an empty project and click Finish

After the creation is complete, copy the following code into it:

#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);
}

What should be noted here is: java String is not the same as cpp String, its corresponding is char*, if you want to use cpp string, it is either garbled or the call fails.

Use VS to generate dll

Here becomes Release, click on the configuration manager to configure the x64 version, so the generated dll is the x64 version, which is very important.

After the configuration is complete, right-click the project and click the Generate button.

After this operation, the dll can basically be generated correctly. If it cannot be generated, it is most likely that your posture is wrong. Follow the article and try again. If it still doesn't work, you can add me to WeChat and ask me.

Where is the dll file generated by VS? Don't worry, let's continue.

Right click on the project

should be noted here that it is in the upper-level directory! Don't take the location of the opened project for granted and just go to x64 to find it, it's useless at all! There is no dll in it, it is in the parent directory, the x64 location of the parent directory.

Develop Java programs

Import Maven dependencies

After creating a new Maven project, introduce the following dependencies in the Maven pom file.

<!-- 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>

Specify dll location

I personally put it under the lib package, so that when importing this package, I can write an absolute path or a relative path.

Write code

Note: The interface method name defined here needs to be consistent with the method name in the 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"));
    }
}

Run the Java program

Run the main method directly, and get the following output.

That's it~~

here today, I’m Glacier, see you in the next issue~~


冰河
156 声望970 粉丝