使用JNI集成C代码到Java项目时编译DLL遇stdio.h缺失错误
嘿,我碰到过一模一样的问题,这就帮你搞定!
首先得搞清楚:你自己代码里删掉stdio.h引用没用的,因为**jni.h本身就依赖stdio.h**——打开JDK里的jni.h看看,开头就有#include <stdio.h>,所以错误的根源不是你的代码,是编译环境没把Visual Studio的标准库头文件路径加进去。
下面是具体的解决步骤:
先确保正确加载VS的编译环境:
别直接双击vcvars32.bat,那样它运行完就退出了,环境变量没保留。你得打开VS2017的开发者命令提示符(x86),这个工具会自动帮你加载好所有VS的编译环境变量,包括标准库的头文件、库文件路径。如果找不到这个提示符,也可以手动打开cmd,然后运行完整路径的vcvars32.bat,比如:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"(路径根据你VS的版本和安装位置调整,比如你装的是Professional版,就把Community换成Professional)
检查编译命令的完整性:
你的cl命令只加了JDK的include路径,还得加上JDK的win32子目录(因为jni_md.h在这里),另外要加上生成动态链接库的参数。比如你的C文件是MyNative.c,完整命令应该是这样:cl -I"C:\Program Files\Java\jdk1.8.0_151\include" -I"C:\Program Files\Java\jdk1.8.0_151\include\win32" -LD MyNative.c -FeMyNative.dll这里
-LD是告诉编译器生成动态链接库,-Fe用来指定输出的dll文件名。注意32位/64位的匹配:
如果你的JDK是64位的,那别用vcvars32.bat,改用vcvars64.bat,否则会出现环境不匹配的问题,导致路径找不到。
按照上面的步骤来,应该就能解决stdio.h找不到的问题了!
内容的提问来源于stack exchange,提问作者Ahmed Salah

