论如何用C++假装写Java
思来想去,还是决定写点最近在学习的和竞赛无关的内容(虽然这让这个博客更有泯然众人的感觉)。不过一直觉得这样的内容还是不大量更新在这个博客好。最近在写一个自己的个人网页,虽然因为期末考已经鸽了一阵子了,但等闲下来了会努力做,届时应该会把这里的内容都搬过去。(竞赛相关的内容会在这里照常更新)
工作环境是万能的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++代码编写的程序了。