java CMake与JNI在VisualStudio和Linux之间具有不同的行为

13z8s7eq  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(151)

我正在尝试使用 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/includeC:/Programs/jdk-17.0.4.101-hotspot/include/win32确实存在。
如何让它在两个世界都能正常工作?提前感谢!

fykwrbwg

fykwrbwg1#

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

ikfrs5lh

ikfrs5lh2#

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

include_directories( ${JNI_INCLUDE_DIRS} ${JAVA_INCLUDE_PATH2} )

在两个世界都很好用!

相关问题