FindJNI

查找 Java 本地接口 (JNI) 的包含目录和库

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

JNI 使运行在 Android 上的 Java 虚拟机 (JVM) 或 Dalvik 虚拟机 (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 抽象窗口工具包 (AWT)。

JVM

在 3.24 版本中添加。

查找 Java 虚拟机 (JVM)。

NativeHelper

在 3.24 版本中添加。

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

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

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

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

导入的目标

此模块提供以下 导入目标

JNI::JNI

在 3.24 版本中添加。

封装所有 JNI 使用要求的 मुख्य target,如果找到 jni.h 则可用。

JNI::AWT

在 3.24 版本中添加。

封装 Java AWT 本地接口 (JAWT) 库使用要求的 target,如果找到 AWT 组件则可用。

JNI::JVM

在 3.24 版本中添加。

封装 Java 虚拟机 (JVM) 库使用要求的 target,如果找到 JVM 组件则可用。

JNI::NativeHelper

在 3.24 版本中添加。

封装 NativeHelper 库使用要求的 target,当目标为 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 本地接口 (JAWT) 库的路径。

JAVA_JVM_LIBRARY

Java 虚拟机 (JVM) 库的路径。

提示

此模块接受以下变量

JAVA_HOME

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

示例

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

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

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

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)

另请参阅

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

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