FindJNI

查找 Java Native Interface (JNI) 的包含目录和库。

JNI 使运行在 Java Virtual Machine (JVM) 或 Dalvik Virtual Machine (DVM) 上的 Java 代码能够调用用 C 和 C++ 等其他语言编写的原生应用程序和库,并被它们调用。

此模块用于查找是否安装了 Java,并确定头文件和库的存放位置。它还会确定库的名称。

在版本 3.24 中添加: 导入的目标、组件和 Android NDK 支持。

使用 Android NDK 时,会报告相应的软件包版本,并且可以请求特定的发行版。在 Android API 级别 31 及以上,可以请求额外的 NativeHelper 组件。 NativeHelper 也作为 JVM 组件的隐式依赖项公开(仅当这不会导致冲突时),它提供了对 JVM 函数的统一访问。

组件

此模块支持可选组件,这些组件可以通过 find_package() 命令指定

find_package(JNI [COMPONENTS <components>...])

支持的组件包括

AWT

在 3.24 版本中添加。

查找 Java Abstract Window Toolkit (AWT)。

JVM

在 3.24 版本中添加。

查找 Java Virtual Machine (JVM)。

NativeHelper

在 3.24 版本中添加。

在 Android 上查找 NativeHelper 库(libnativehelper.so),该库公开 JNI_CreateJavaVM() 等 JVM 函数。

如果未指定任何组件,则模块的默认值为

  • 当以 API 级别 31 及以上版本为 Android 进行目标设置时:模块查找 NativeHelper 组件。对于其他 Android API 级别,默认情况下不设置组件。

  • 当以其他系统为目标时:模块查找 AWTJVM 组件。

导入的目标

此模块提供以下 导入目标

JNI::JNI

在 3.24 版本中添加。

封装所有 JNI 使用需求的主目标,如果找到 jni.h 则可用。

JNI::AWT

在 3.24 版本中添加。

封装 Java AWT Native Interface (JAWT) 库使用需求的目标,如果找到 AWT 组件则可用。

JNI::JVM

在 3.24 版本中添加。

封装 Java Virtual Machine (JVM) 库使用需求的目标,如果找到 JVM 组件则可用。

JNI::NativeHelper

在 3.24 版本中添加。

封装 NativeHelper 库使用需求的目标,在以 Android API 级别 31 及以上版本为目标且找到库时可用。

结果变量

此模块定义了以下变量

JNI_FOUND

一个布尔值,指示是否找到 JNI。

JNI_<component>_FOUND

在 3.24 版本中添加。

一个布尔值,指示是否找到 <component>

JNI_VERSION

完整的 Android NDK 软件包版本(包括 -beta3-rc1 等后缀)或在其他情况下未定义。

JNI_VERSION_MAJOR

在 3.24 版本中添加。

Android NDK 主版本号,或在其他情况下未定义。

JNI_VERSION_MINOR

在 3.24 版本中添加。

Android NDK 次版本号,或在其他情况下未定义。

JNI_VERSION_PATCH

在 3.24 版本中添加。

Android NDK 补丁版本号,或在其他情况下未定义。

JNI_INCLUDE_DIRS

使用 JNI 所需的包含目录。

JNI_LIBRARIES

使用 JNI 所需链接的库(JAWT 和 JVM)。

缓存变量

以下缓存变量也可用于设置或使用

JAVA_INCLUDE_PATH

包含 jni.h 头文件的目录。

JAVA_INCLUDE_PATH2

包含机器相关头文件 jni_md.hjniport.h 的目录。仅当 jni.h 依赖于其中一个头文件时,此变量才会被定义。相比之下,Android NDK 的 jni.h 通常可以独立使用。

JAVA_AWT_INCLUDE_PATH

包含 jawt.h 头文件的目录。

JAVA_AWT_LIBRARY

Java AWT Native Interface (JAWT) 库的路径。

JAVA_JVM_LIBRARY

Java Virtual Machine (JVM) 库的路径。

提示

此模块接受以下变量

JAVA_HOME

调用者可以设置此变量来显式指定 Java 的安装目录。

示例

查找 JNI 并将其链接到项目目标

find_package(JNI)
target_link_libraries(project_target PRIVATE JNI::JNI)

查找 JNI 并指定 AWT 组件,并将它们链接到项目目标

find_package(JNI COMPONENTS AWT)
target_link_libraries(project_target PRIVATE JNI::JNI JNI::AWT)

在 CMake 中使用 Java 和 JNI 的更常见方法是使用专用的 UseJava 模块

find_package(Java)
find_package(JNI)
include(UseJava)

另请参阅

  • 使用 FindJava 模块来查找 Java 运行时工具和开发组件。

  • 使用 UseJava 模块在 CMake 中使用 Java。