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 级别,默认情况下不设置组件。当以其他系统为目标时:模块查找
AWT和JVM组件。
导入的目标¶
此模块提供以下 导入目标
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.h和jniport.h的目录。仅当jni.h依赖于其中一个头文件时,此变量才会被定义。相比之下,Android NDK 的jni.h通常可以独立使用。JAVA_AWT_INCLUDE_PATH包含
jawt.h头文件的目录。JAVA_AWT_LIBRARYJava AWT Native Interface (JAWT) 库的路径。
JAVA_JVM_LIBRARYJava 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)