在CMake中使用Java生成\u本地\u头
CMake看起来真的很酷。就在前几天,我发现我可以用它将Java源代码编译成JAR。也有一个选择。但是,它不会为我生成标题。生成的Makefile调用在CMake中使用Java生成\u本地\u头,java,cmake,java-native-interface,Java,Cmake,Java Native Interface,CMake看起来真的很酷。就在前几天,我发现我可以用它将Java源代码编译成JAR。也有一个选择。但是,它不会为我生成标题。生成的Makefile调用javac,而不调用-h someplace。有什么我可能遗漏的提示吗?这就是我到目前为止所做的: CMakeLists.txt 本地的 SomeJava.java 如果我手动调用javac来生成SomeJava.h,它工作得很好。根据中的示例,您可能希望链接到生成的接口目标,名为SomeJava native: 然后,可以使用target_lin
javac
,而不调用-h someplace
。有什么我可能遗漏的提示吗?这就是我到目前为止所做的:
CMakeLists.txt
本地的
SomeJava.java
如果我手动调用javac
来生成SomeJava.h
,它工作得很好。根据中的示例,您可能希望链接到生成的接口
目标,名为SomeJava native
:
然后,可以使用target_link_libraries()命令将生成的本机头目标用于编译C/C++源代码
目前,您的代码似乎没有使用此目标,因此您可以将其添加到CMake文件的末尾:
target_link_libraries(native PRIVATE SomeJava-native)
此外,请确保您的CMake版本为3.11或更高版本,因为早期版本中没有“生成本地”标题功能。您使用的是哪个版本的JDK?还有,CMake的哪个版本?@squareskittles CMake 3.10和Java 11。如有必要,我可以升级到更新的版本。请参阅我的更新答案,您的CMake版本可能是问题所在。@squareskittles我没有意识到我使用了几天的文档所指的版本与使用的版本不同。不过,只差一个小版本。我不知道CMake不会抱怨未知选项。非常感谢。
#include "SomeJava.h"
JNIEXPORT void JNICALL Java_SomeJava_printHelloWorld(JNIEnv * env, jclass cls) {
printf("Native Hello World!\n");
}
public class SomeJava {
public static void main(String[] args) {
printHelloWorld();
}
static {
System.loadLibrary("native");
}
public static native void printHelloWorld();
}
target_link_libraries(native PRIVATE SomeJava-native)