与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合作

谷歌与美国五角大楼合作的Maven项目曝光,引发部分职员抗议和辞职

金融时报:Po.et与美国超高流量媒体Maven达成战略合作

Maven实战之antrun插件

资讯通用汽车与Uber合作 将Maven汽车共享引入澳大利亚

Maven Shade 插件 + MsSQL JDBC -> 即时 JNI 错误 - 无效的签名文件清单