Mac OSX 10.11.6编译JNI代码报‘jni.h’未找到,求正确命令
问题解答
是的,你用的这个指南确实严重过时了——它针对的是Mac OS X 10.6(Snow Leopard)这种距今十几年的老旧系统,现在的macOS版本(比如Ventura、Sonoma,以及M系列芯片的设备)的Java头文件路径、JDK安装结构都已经完全改变了,所以找不到jni.h是必然的。
为什么旧命令失效?
旧命令里的两个路径:
/Developer/SDKs/MacOSX10.6.sdk:这个目录在现代macOS里早就被移除了,Apple已经不再默认预装开发者SDK到这个位置,而且10.6的SDK也完全不适用于当前系统。/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Headers:现在Apple已经不再提供默认的系统级JDK,用户通常安装的是第三方JDK(比如Oracle JDK、Adoptium/Azul Zulu的OpenJDK),这些JDK的头文件都存放在自己的安装目录里,而非系统框架的旧路径中。
当前正确的编译命令
现在的核心是找到你当前使用的JDK的include目录,以下是两种通用方案:
方案1:利用JAVA_HOME环境变量(推荐)
如果你已经设置了JAVA_HOME(指向你的JDK安装目录),直接用这个命令:
g++ -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" -c HelloWorld.cpp
方案2:自动获取当前默认JDK路径
如果你没设置JAVA_HOME,可以用macOS自带的/usr/libexec/java_home命令自动获取默认JDK的路径,命令如下:
g++ -I"$(/usr/libexec/java_home)/include" -I"$(/usr/libexec/java_home)/include/darwin" -c HelloWorld.cpp
额外说明
- 如果你使用的是M系列芯片(arm64架构)的Mac,需要编译x86_64架构的库来兼容某些Java程序,可以在命令中添加
-arch x86_64参数:g++ -arch x86_64 -I"$(/usr/libexec/java_home)/include" -I"$(/usr/libexec/java_home)/include/darwin" -c HelloWorld.cpp - 编译完成后,生成
.o文件后,还需要链接成动态库(.dylib),命令大概是:g++ -dynamiclib -o libHelloWorld.jnilib HelloWorld.o -framework JavaVM
内容的提问来源于stack exchange,提问作者Quayle
相关产品推荐
相关产品推荐

