You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java Native Interface时添加package关键字引发类找不到错误的问题求助

其实你自己已经找到问题的核心啦——执行Java命令前没回到上级目录!我来帮你把整个流程理清楚,顺便说说为什么带package时会出现类找不到的错误:

问题本质

当你给Java类加上package Test;声明后,JVM会遵循类加载的规则:带包名的类必须放在与包名同名的文件夹下,并且执行java命令时要从这个文件夹的上级目录启动,这样JVM才能识别出包结构,找到对应的类。

正确的完整操作流程

按照你当前的文件结构(Test文件夹下存放所有.java、.cpp文件),正确步骤如下:

  1. 编译Java文件并生成JNI头文件
    先进入Test文件夹,执行命令:

    javac -h . AddNumbers.java
    

    这会在Test文件夹里生成AddNumbers.class和AddNumbers.h,此时这个class文件已经属于Test包了。

  2. 编译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)在这个子目录里,不加的话编译会报错哦。

  3. 运行Java程序(关键步骤)
    这一步一定要回到Test文件夹的上级目录,然后执行:

    java Test.AddNumbers
    

    这样JVM会从当前目录(包的根目录)去查找Test包下的AddNumbers类,自然就能找到了。

为什么移除package就正常?

当你删掉package Test;后,类属于默认包,此时在类文件所在的Test文件夹直接执行java AddNumbers,JVM能直接找到默认包下的类,所以不会报错。

额外小提醒

如果运行时提示找不到addNumbers.dll,可以用-Djava.library.path指定dll所在的路径,比如:

java -Djava.library.path=./Test Test.AddNumbers

这样JVM就会去Test文件夹里找你的动态链接库啦。

内容的提问来源于stack exchange,提问作者MatErW3len

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 14:39:04