gpt4 book ai didi

java - 使用 Maven 和 JNI 进行 CMake

转载 作者:行者123 更新时间:2023-12-02 11:34:46 28 4
gpt4 key购买 nike

我使用 CMake 调用 Maven,它会生成一个 JAR 文件,我稍后要为其创建 JNI header 。

...
find_package(Java REQUIRED)
find_package(JNI REQUIRED)
include(UseJava)

set(PROJECT_TARGET_DIR "${CMAKE_CURRENT_SOURCE_DIR}/target")
set(PROJECT_JAR "core-${VERSION}.jar")

add_custom_command(
OUTPUT "${PROJECT_TARGET_DIR}/${PROJECT_JAR}"
COMMAND mvn clean install
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
VERBATIM
)
add_custom_target(
JavaProject ALL
DEPENDS "${PROJECT_TARGET_DIR}/${PROJECT_JAR}"
)
create_javah(
TARGET JavaHeaders
CLASSES com.some.class
CLASSPATH "${PROJECT_TARGET_DIR}/${PROJECT_JAR}"
DEPENDS JavaProject
OUTPUT_NAME MyHeaders.h
)

这种方法的问题在于,虽然 JAR 仅在构建时生成,但 create_javah 检查其在 CLASSPATH 中的存在构建系统生成时间,即使我指定它取决于目标 JavaProject:

...
-- Found Java: /usr/lib/jvm/default-java/bin/java (found version "1.8.0.151")
-- Found JNI: /usr/lib/jvm/default-java/jre/lib/amd64/libjawt.so
CMake Error at /usr/share/cmake-3.9/Modules/UseJava.cmake:1293 (message):
create_javah: CLASSPATH entry
/path/to/target/core-5.12.0.3.jar does
not exist.
Call Stack (most recent call first):
jni/NsEttPos/CMakeLists.txt:17 (create_javah)

如何在生成时跳过此检查?

最佳答案

create_javah CLASSPATH 选项可以指定目录、已有的 jar 文件或使用 add_jar 创建的目标命令。仅当 jar 文件是由 CMake add_jar 命令创建时,才允许它仅在构建时存在。

但是,由于 create_javah 仅检查 JAR_FILE 属性是否存在,因此您可以尝试应用以下技巧:

add_custom_target(
JavaProject ALL
DEPENDS "${PROJECT_TARGET_DIR}/${PROJECT_JAR}"
)
# Add a JAR_FILE property to the JavaProject for create_javah
set_property(
TARGET JavaProject
PROPERTY JAR_FILE "${PROJECT_TARGET_DIR}/${PROJECT_JAR}"
)

然后将 JavaProject 目标直接传递给 create_javah CLASSPATH 选项:

create_javah(
TARGET JavaHeaders
CLASSES com.some.class
CLASSPATH JavaProject
OUTPUT_NAME MyHeaders.h
)

另请注意,不再需要 DEPENDS JavaProject,因为 create_javah 会自动为其添加依赖项。

关于java - 使用 Maven 和 JNI 进行 CMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49028473/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com