与Maven和JNI合作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与Maven和JNI合作相关的知识,希望对你有一定的参考价值。
我正在使用CMake调用Maven,它生成一个JAR文件,我以后想要为其创建JNI头文件。
...
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
属性的存在,您可以尝试应用以下hack:
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
会自动添加依赖关系。
以上是关于与Maven和JNI合作的主要内容,如果未能解决你的问题,请参考以下文章
谷歌与美国五角大楼合作的Maven项目曝光,引发部分职员抗议和辞职
金融时报:Po.et与美国超高流量媒体Maven达成战略合作