CMake vs JNI在VisualStudio和Linux之间有不同的行为



我试图使用CMake创建一个多平台项目(Windows+VisualStudio和Linux+gcc)使用jni。问题是jni_md.h在Linux中很常见,但在MSVC中没有。jni_md.h在包含jni.h的子目录下的与平台相关的子目录中。.

这是我的项目的一个非常小的摘录:CMakeLists.txt :

cmake_minimum_required( VERSION 3.12 )
find_package( JNI 11 REQUIRED )
project( spam )
include_directories( ${JNI_INCLUDE_DIRS} )
add_executable( spam main.cpp )

main.cpp :

#include <jni.h>
int main () {}

在这两种情况下,cmake .工作良好。
在Linux世界:命令cmake . --build工作得很好,在gcc的详细跟踪中,我可以看到这些包括:
-I /usr/lib/jvm/java-11-openjdk-amd64/include -I /usr/lib/jvm/java-11-openjdk-amd64/include/linux。(我想知道CMake如何发现它必须添加第二条路径)

但是它在windows世界中变得越来越糟糕:在Visual Studio解决方案中,我可以看到C:/Programs/jdk-17.0.4.101-hotspot/include属性/包含目录中运行良好,但C:/Programs/jdk-17.0.4.101-hotspot/include/win32(其中包含jni_md.h)却没有。(.
并且,毫无疑问,cmake --build .命令失败了:

Building Custom Rule CMakeLists.txt
include
c1xx : fatal error C1083: 'C:/Programs/jdk-17.0.4.101-hotspot/include' : No such file or directory [spam.vcxproj]
main.cpp
C:Programsjdk-17.0.4.101-hotspotincludejni.h(45): fatal error C1083: 'jni_md.h' : No such file or directory

顺便说一下,C:/Programs/jdk-17.0.4.101-hotspot/includeC:/Programs/jdk-17.0.4.101-hotspot/include/win32确实存在。

如何使它在两个世界中正常工作?提前感谢!

FindJNI显然区分了需要和不需要jni_md.h的平台。在你的情况下,它得出了错误的结论。但是,它应该已经计算出路径并将其放入JAVA_INCLUDE_PATH2变量中。在其他平台上,它被折叠到JNI_INCLUDE_DIR变量中,因此再次将其添加为包含目录是无害的。

很谢谢Botje,正确的解决方案是使用变量JAVA_INCLUDE_PATH2(它似乎与JNI_INCLUDE_DIRS同时设置)。
只需像这样编辑CMakeLists.txt:

include_directories( ${JNI_INCLUDE_DIRS} ${JAVA_INCLUDE_PATH2} )

它在两个世界中都工作得很好!

相关内容

  • 没有找到相关文章

最新更新