使用Java Native Interface时添加package关键字引发类找不到错误的问题求助
其实你自己已经找到问题的核心啦——执行Java命令前没回到上级目录!我来帮你把整个流程理清楚,顺便说说为什么带package时会出现类找不到的错误:
当你给Java类加上package Test;声明后,JVM会遵循类加载的规则:带包名的类必须放在与包名同名的文件夹下,并且执行java命令时要从这个文件夹的上级目录启动,这样JVM才能识别出包结构,找到对应的类。
按照你当前的文件结构(Test文件夹下存放所有.java、.cpp文件),正确步骤如下:
编译Java文件并生成JNI头文件
先进入Test文件夹,执行命令:javac -h . AddNumbers.java这会在
Test文件夹里生成AddNumbers.class和AddNumbers.h,此时这个class文件已经属于Test包了。编译C++代码生成动态链接库
同样在Test文件夹下执行编译命令(注意路径有空格要加引号,还要加上Windows特有的JNI头文件目录):# 编译成目标文件 g++ -c -I"C:\Program Files\Java\jdk-17\include" -I"C:\Program Files\Java\jdk-17\include\win32" AddNumbers.cpp -o AddNumbers.o # 生成dll文件 g++ -shared -o addNumbers.dll AddNumbers.o小提示:加上
include\win32是因为Windows平台的JNI依赖头文件(比如jni_md.h)在这个子目录里,不加的话编译会报错哦。运行Java程序(关键步骤)
这一步一定要回到Test文件夹的上级目录,然后执行:java Test.AddNumbers这样JVM会从当前目录(包的根目录)去查找
Test包下的AddNumbers类,自然就能找到了。
当你删掉package Test;后,类属于默认包,此时在类文件所在的Test文件夹直接执行java AddNumbers,JVM能直接找到默认包下的类,所以不会报错。
如果运行时提示找不到addNumbers.dll,可以用-Djava.library.path指定dll所在的路径,比如:
java -Djava.library.path=./Test Test.AddNumbers
这样JVM就会去Test文件夹里找你的动态链接库啦。
内容的提问来源于stack exchange,提问作者MatErW3len

