Mac+Java11环境编译quickjs-wrapper提示'jni.h'文件未找到
解决Mac+Java11下编译quickjs-wrapper时'jni.h'未找到的问题
问题背景
在Mac系统、Java 11环境下,尝试使用quickjs-wrapper在Java中集成quickjs(因Nashorn已弃用未选择它),执行编译命令:
cmake --build ./build/cmake --target quickjs-java-wrapper -j 6
时报错提示'jni.h' file not found。已配置JAVA_HOME,且确认jni.h存在于$JAVA_HOME/include目录,但问题仍未解决。
环境变量配置:
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/selvakumar/apache-maven-3.5.2/bin:/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home/bin:/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home/include
完整错误信息:
apples-MacBook-Pro:wrapper-java selvakumar$ cmake --build ./build/cmake --target quickjs-java-wrapper -j 6 [1/3] Building CXX object CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_context_jni.cpp.o FAILED: CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_context_jni.cpp.o /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DCONFIG_BIGNUM -DCONFIG_VERSION="2021-03-27" -Dquickjs_java_wrapper_EXPORTS -I/include -I/include/darwin -g -std=gnu++11 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk -fPIC -MD -MT CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_context_jni.cpp.o -MF CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_context_jni.cpp.o.d -o CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_context_jni.cpp.o -c /Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_context_jni.cpp /Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_context_jni.cpp:1:10: fatal error: 'jni.h' file not found #include <jni.h> ^~~~~~~ 1 error generated. [2/3] Building CXX object CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_wrapper.cpp.o FAILED: CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_wrapper.cpp.o /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DCONFIG_BIGNUM -DCONFIG_VERSION="2021-03-27" -Dquickjs_java_wrapper_EXPORTS -I/include -I/include/darwin -g -std=gnu++11 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk -fPIC -MD -MT CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_wrapper.cpp.o -MF CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_wrapper.cpp.o.d -o CMakeFiles/quickjs-java-wrapper.dir/Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_wrapper.cpp.o -c /Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_wrapper.cpp In file included from /Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_wrapper.cpp:4: /Users/selvakumar/newworkspace/quickjs-wrapper/native/cpp/quickjs_wrapper.h:15:10: fatal error: 'jni.h' file not found #include <jni.h> ^~~~~~~ 1 error generated. ninja: build stopped: subcommand failed.
问题分析
从错误日志的编译参数可见,编译器的头文件搜索路径是-I/include -I/include/darwin,这是相对路径而非$JAVA_HOME/include的绝对路径,说明CMake未正确读取JAVA_HOME环境变量,或是项目CMake配置未正确引用JAVA_HOME设置头文件路径。
解决步骤
1. 确保JAVA_HOME环境变量生效
在终端执行以下命令验证JAVA_HOME是否能被正确读取:
echo $JAVA_HOME
若输出为空或路径错误,需重新配置环境变量:
- zsh用户编辑
~/.zshrc,添加:export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home export PATH=$JAVA_HOME/bin:$PATH - bash用户编辑
~/.bash_profile或~/.bashrc,添加相同内容。
执行source ~/.zshrc(对应自己的配置文件)使配置生效,再次验证JAVA_HOME。
2. 重新运行CMake配置
旧的CMake缓存可能导致新环境变量未被读取,需删除缓存后重新配置:
# 删除旧build目录 rm -rf ./build/cmake # 创建新build目录并进入 mkdir -p ./build/cmake && cd ./build/cmake # 指定JAVA_HOME执行CMake配置 cmake -DJAVA_HOME=$JAVA_HOME ../../ # 重新编译 cmake --build . --target quickjs-java-wrapper -j 6
3. 手动修改CMake配置(若上述步骤无效)
若CMake仍未正确设置头文件路径,可修改项目的CMakeLists.txt(通常在native/cpp目录下),添加JDK头文件路径:
# 找到头文件包含部分,添加以下内容 include_directories( $ENV{JAVA_HOME}/include $ENV{JAVA_HOME}/include/darwin )
保存后,重新执行步骤2的CMake配置和编译命令。
4. 临时方案:编译时手动指定头文件路径
若不想修改CMake配置,可在编译时直接添加头文件搜索路径:
cmake --build ./build/cmake --target quickjs-java-wrapper -j 6 -- -I$JAVA_HOME/include -I$JAVA_HOME/include/darwin
内容的提问来源于stack exchange,提问作者Selvakumar Ponnusamy
相关产品推荐
相关产品推荐

