我试图使用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/include
和C:/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} )
它在两个世界中都工作得很好!