思来想去,还是决定写点最近在学习的和竞赛无关的内容(虽然这让这个博客更有泯然众人的感觉)。不过一直觉得这样的内容还是不大量更新在这个博客好。最近在写一个自己的个人网页,虽然因为期末考已经鸽了一阵子了,但等闲下来了会努力做,届时应该会把这里的内容都搬过去。(竞赛相关的内容会在这里照常更新)
工作环境是万能的vscode,扩展装了普通的Java和C/C++扩展,以及Code Runner。
为了方便自定义编译命令,需要把g++所在目录放到环境变量里去(我直接贺了Dev-cpp的目录),虽然不知道是否必要,java的目录最好也放进去
首先需要胡写一段Java代码:
public class Main { static { System.loadLibrary("my_fft"); } public static native void dofft(); public static void main(String[] args) { dofft(); } }
接着cmd调用javac -h . Main.java
,系统会自动生成一个名为Main.h
的头文件,如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Main */ #ifndef _Included_Main #define _Included_Main #ifdef __cplusplus extern "C" { #endif /* * Class: Main * Method: dofft * Signature: ()V */ JNIEXPORT void JNICALL Java_Main_dofft (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
接下来让目标cpp文件include该头文件,再把头文件里最关键的JNIEXPORT void JNICALL Java_Main_dofft(JNIEnv *, jclass)
贺下来替换原来的cpp文件的main()
,用cmd编译cpp:
g++ -m64 -I"C:\Program Files\Eclipse Adoptium\jdk-17.0.1.12-hotspot\include" -I"C:\Program Files\Eclipse Adoptium\jdk-17.0.1.12-hotspot\include\win32" -shared fft.cpp -o my_fft.dll
这样就生成了名为my_fft.dll
的文件,此时调用命令java Main
执行,就可以使用C++代码编写的程序了。