也可以用 JNA,但性能没有 JNI 好。JNA的Demo没有做,可以参考(​​https://www.bilibili.com/video/BV1xU4y1F7Ep/?spm_id_from=autoNext​​)

JNI 参考(​​https://www.runoob.com/w3cnote/jni-getting-started-tutorials.html​​)

 

Windows 下是不能调 .so
Andorid 编译的 .so 是没办法在 linux 下运行

 

代码程序:

JNIDemo.java

package com.vipsoft.demo;

public class JNIDemo {

public native void testHello(int currentTime);

public static void main(String[] args) {
//加载C文件
System.loadLibrary("TestJNI");
JNIDemo jniDemo = new JNIDemo();
for (int i = 1; i <= 10; i++) {
jniDemo.testHello(i);
}
}
}

 

com_vipsoft_demo_JNIDemo.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_vipsoft_demo_JNIDemo */

#ifndef _Included_com_vipsoft_demo_JNIDemo
#define _Included_com_vipsoft_demo_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_vipsoft_demo_JNIDemo
* Method: testHello
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_com_vipsoft_demo_JNIDemo_testHello
(JNIEnv *env, jobject obj, jint args);

#ifdef __cplusplus
}
#endif
#endif

 

TestJNI.cpp

#include "pch.h"
#include "com_vipsoft_demo_JNIDemo.h"

JNIEXPORT void JNICALL Java_com_vipsoft_demo_JNIDemo_testHello
(JNIEnv *env, jobject obj, jint args) {
printf("This is C++ print => %d \n", args);
}

下面是创建步骤,代码内容以上面的为准(一开始传参失败,后面调整了参数)

创建 Java 项目

Intellij Java JNI 调用 C++_#include


Intellij Java JNI 调用 C++_#include_02

 

 

 打开目录

Intellij Java JNI 调用 C++_#include_03

 

 

 

Intellij Java JNI 调用 C++_Java_04

 

Intellij Java JNI 调用 C++_Java_05

 

 

 

生成 jni 文件

javah -classpath . -jni -encoding UTF-8 com.vipsoft.demo.JNIDemo

Intellij Java JNI 调用 C++_java_06

 

 

 

生成头文件

2. 创建一个C++项目

Intellij Java JNI 调用 C++_#include_07

Intellij Java JNI 调用 C++_#include_08

 

 

Intellij Java JNI 调用 C++_Java_09

 

 

Intellij Java JNI 调用 C++_java_10

 

 右击将com_vipsoft_demo_JNIDemo.h 加载到 VS中

新建源文件在【源文件】目录上右击选择【新建项】

 

 

Intellij Java JNI 调用 C++_java_11

 

 

 

 

Intellij Java JNI 调用 C++_Java_12

  

TestJNI.CPP

Intellij Java JNI 调用 C++_Java_13

 

 右击项目属性,添加 JDK 目录,否则<jni.h> 会报红 

Intellij Java JNI 调用 C++_Java_14

 

 

右击生成

 

Intellij Java JNI 调用 C++_java_15

 

 

Intellij Java JNI 调用 C++_java_16

 

也可以把DLL放在java 的resources 目录下,这样就不需要添加 VM options 了,放到外面,用参数引用,方便替换算法,无需再打包

-Djava.library.path=

Intellij Java JNI 调用 C++_Java_17

 

Intellij Java JNI 调用 C++_java_18