在 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
功能在早期版本中不可用。
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
功能在早期版本中不可用。