论如何用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++代码编写的程序了。

posted @ 2021-12-11 20:52  Mr_Spade  阅读(327)  评论(0编辑  收藏  举报