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

从C++调用Java方法时出现HelloWorld类找不到问题求助

问题描述

我正在尝试从C调用Java方法,编写了如下C代码:

#include <jni.h>
#include <iostream>

// Function to create the JVM and call the sayHi method
void callJavaSayHi() {
    // Options to initialize the JVM
    JavaVMOption options[1];
    options[0].optionString = const_cast<char *>("-Djava.class.path=.");

    // JVM initialization arguments
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = false;

    // Pointer to the JVM (Java Virtual Machine)
    JavaVM *jvm;
    // Pointer to native interface
    JNIEnv *env;

    // Create the JVM
    jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    if (res != JNI_OK) {
        std::cerr << "Failed to create JVM: " << res << std::endl;
        exit(EXIT_FAILURE);
    } else {
        std::cout << "JVM created successfully" << std::endl;
    }

    // Find the Java class
    jclass helloWorldClass = env->FindClass("HelloWorld");
    if (helloWorldClass == nullptr) {
        std::cerr << "Failed to find HelloWorld class" << std::endl;
        jvm->DestroyJavaVM();
        exit(EXIT_FAILURE);
    } else {
        std::cout << "HelloWorld class found" << std::endl;
    }
 }

但env->FindClass("HelloWorld")始终无法返回类指针,报错“Failed to find HelloWorld class”。

我的Java类代码如下:

public class HelloWorld {
    // Java method to be called from C++
    public void sayHi() {
        System.out.println("Hello from Java!");
    }
}

文件结构为:

-HelloWorld.class
-HelloWorld.java
-InvokeJavaMethod.cpp

请问哪里操作出错了?

解决方法

以下是几个关键问题点及修复方案:

1. 类路径与工作目录不匹配

虽然代码中设置了-Djava.class.path=.,但要保证运行C++程序时的当前工作目录确实是包含HelloWorld.class的文件夹。如果用IDE运行,需检查IDE的工作目录配置是否指向该文件夹。

也可以直接指定绝对路径测试:

options[0].optionString = const_cast<char *>("-Djava.class.path=/完整路径/到/你的类文件目录");

2. Java类编译异常

确认HelloWorld.class是正常编译的,重新执行编译命令排查:

javac HelloWorld.java

检查是否生成了无错误的HelloWorld.class文件。

3. JNI版本与JDK版本不兼容

代码中指定的JNI_VERSION_1_6如果和当前系统的JDK版本不匹配,会导致类加载异常。若你的JDK是8及以上版本,可替换为:

vm_args.version = JNI_VERSION_1_8;

4. 启用类加载日志排查

添加JVM日志参数,查看类加载的详细过程,定位具体错误:

JavaVMOption options[2];
options[0].optionString = const_cast<char *>("-Djava.class.path=.");
options[1].optionString = const_cast<char *>("-verbose:class"); // 打印类加载日志
vm_args.nOptions = 2;

运行程序后,会输出所有类的加载记录,可查看HelloWorld类的加载失败细节。

5. C++编译链接参数错误

编译C++程序时,必须正确链接JVM的库文件:

  • Linux下编译命令示例:
g++ InvokeJavaMethod.cpp -o InvokeJavaMethod -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -L$JAVA_HOME/jre/lib/amd64/server -ljvm
  • Windows下需链接jvm.lib,确保编译时指定了正确的库路径和文件名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:27:20