最近在写JNI,打算用java去调 C 或 C++ 去操作操作系统底层的API。MFC编程已经算是一个非常老的技术了。在MFC库中提供了大量的windows-api,故准备写JNI去调用windows底层api。

因为习惯使用Jetbrains家的产品,对于快捷键从Idea系列无缝对接所以选择了Clion作为C的编写。
当然这里也可以选择Visual Studio

使用Clion写C的话,你需要 配置编译环境(按照这篇文章进行配置即可)
如果你不想麻烦可以使用Visual Studio下载好 MFC库,这里添加Visual studio的选项,把Environment选择到VS的目录,重启Clion即可生效
在这里插入图片描述
假设,你遇到了下面的错误

遇到的错误

NMAKE : fatal error U1077: “D:\PROGRA~2\MIB055~1\2022\COMMUN~1\VC\Tools\MSVC\1430~1.307\bin\Hostx86\x86\cl.exe”: 返回代码“0x2”
NMAKE : fatal error U1077: “"D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\HostX86\x86\nmake.exe"”: 返回代码“0x2”
NMAKE : fatal error U1077: “"D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\HostX86\x86\nmake.exe"”: 返回代码“0x2”
NMAKE : fatal error U1077: “"D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\HostX86\x86\nmake.exe"”: 返回代码“0x2”

解决方法

需要加上下面这几行代码,作用就是支持MFC,需要注意(JHelloWorld是我的项目名,你需要改成自己的项目名)

set(CMAKE_MFC_FLAG 2)
set_target_properties(JHelloWorld PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS")
target_compile_definitions(JHelloWorld PRIVATE
        -DWIN32
        -D_DEBUG
        -D_WINDOWS
        -D_VC80_UPGRADE=0x0600
        -D_UNICODE
        -DUNICODE
        -D_AFXDLL
        )

此前如果你没有设置下面这个配置,那么想要run起来的话需要加上

(JHelloWorld是我的项目名,你需要改成自己的项目名,all_handle.cpp 是带main方法的源文件,如果你想要跑这个源文件的话,需要在这行加上源文件的路径我这里放在了根路径所以直接文件名了)

add_executable(JHelloWorld all_handle.cpp)

需要注意的是,这行需要加在上面的配置之上,否则保存后会直接报错


完整的CMakeLists.txt(参考)

JHelloWorld 是项目名,自行替换。
all_handle.cpp是带main的源文件,自行替换

cmake_minimum_required(VERSION 3.17)
project(JHelloWorld)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_MFC_FLAG 2)

add_executable(JHelloWorld all_handle.cpp)

# 如果想要生成dll库,可以将下面的注释打开,注意JHelloWorld是我的项目名,
# top_yumbo_jni_JavaCallCpp.cpp是jni用的
# add_executable(jni ${SOURCE_FILES})
#add_library(
#        JHelloWorld
#        SHARED
#        top_yumbo_jni_JavaCallCpp.cpp
#)
#target_link_libraries(JHelloWorld) # 编译的目标,前面有add lib 所以这里会将前面add的lib生成dll文件


set_target_properties(JHelloWorld PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS")
target_compile_definitions(JHelloWorld PRIVATE
        -DWIN32
        -D_DEBUG
        -D_WINDOWS
        -D_VC80_UPGRADE=0x0600
        -D_UNICODE
        -DUNICODE
        -D_AFXDLL
        )

完成上面设置后就可以正常run了,如果没有run按钮可以设置里选择
在这里插入图片描述
在这里插入图片描述
下面是正常run debug起来的例子

在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐