在 CMake 中使用 Java GENERATE_NATIVE_HEADERS

UseJava in CMake to GENERATE_NATIVE_HEADERS

CMake 似乎真的很酷。就在前几天,我发现我可以用它来将 Java 源代码编译成 jar。还有一个选项 GENERATE_NATIVE_HEADERS。但是,它不会为我生成 headers。生成的 Makefile 调用 javac 而没有 -h someplace。有什么提示我可能会遗漏什么吗?这是我目前所拥有的:

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
find_package(Java 11 REQUIRED)
find_package(Java COMPONENTS Development)
find_package(JNI REQUIRED)
include(UseJava)
add_jar(SomeJava 
    SomeJava.java
    ENTRY_POINT SomeJava
    GENERATE_NATIVE_HEADERS SomeJava-native
)
add_library(native SHARED
    native.c
)
target_include_directories(native PRIVATE
    ${JNI_INCLUDE_DIRS}
)

native.c

#include "SomeJava.h"
JNIEXPORT void JNICALL Java_SomeJava_printHelloWorld(JNIEnv * env, jclass cls) {
    printf("Native Hello World!\n");
}

SomeJava.java

public class SomeJava {
    public static void main(String[] args) {
        printHelloWorld();
    }
    static {
        System.loadLibrary("native");
    }
    public static native void printHelloWorld();
}

如果我手动调用 javac 来生成 SomeJava.h,它工作正常。

根据 documentation 中的示例,您可能希望 link 生成名为 SomeJava-native:

的目标 INTERFACE

The produced target for native headers can then be used to compile C/C++ sources with the target_link_libraries() command.

目前,您的代码似乎没有使用此目标,因此您可以将其添加到 CMake 文件的末尾:

target_link_libraries(native PRIVATE SomeJava-native)

此外,请确保您的 CMake 版本为 3.11 或更高版本,因为 GENERATE_NATIVE_HEADERS 功能在早期版本中不可用。