我正在尝试使用 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
位于 *properties/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:\Programs\jdk-17.0.4.101-hotspot\include\jni.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
确实存在。
如何让它在两个世界都能正常工作?提前感谢!
2条答案
按热度按时间fykwrbwg1#
FindJNI显然区分了需要jni_md.h的平台和不需要jni_md.h的平台。在您的例子中,它得出了错误的结论。尽管如此,它应该计算路径并将其放入
JAVA_INCLUDE_PATH2
变量中。在其他平台上,它被折叠到JNI_INCLUDE_DIR
变量中,因此再次将其添加为包含目录是无害的。ikfrs5lh2#
感谢***Botje***,正确的解决方案是使用变量 JAVA_INCLUDE_PATH2(似乎与 JNI_INCLUDE_DIRS 同时设置)。
只需像这样编辑 * CMakeLists.txt *:
在两个世界都很好用!