“noclassdeffounderror”使用c++中的jni调用java类,并将依赖项打包到jar中

bmp9r5qi  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(321)

我试图在c程序中使用一个相当复杂的java程序。让我澄清一下,我对java了解不多,所以我希望我不会过度解释java或者说一些关于java的废话。
为了我的目的,我正在使用jni。jvm的创建工作得很好,我已经能够成功地调用c
程序中的简单类,即编译成类的单个java文件,包含在与我的cpp相同的目录中,没有依赖关系。
现在,我愿意从一个java程序中调用方法,该程序是1。是包的一部分,2。在包之外有很多依赖关系,3。没有主管道。
我的想法是首先在eclipse中构建一个包的“runnable jar”,我想从中调用方法,假设它包含外部依赖项。
我不太清楚jar是怎么工作的,所以我可能在这方面错了,或者在这个过程中犯了错误。我可能在某种程度上不包括所有的依赖?这是我目前的假设,但是我怎么能检查并得到比下面显示的异常告诉我的更多的细节呢?我还假设我想要使用类的包没有main是可以的,因为最终我只想使用一个方法,但是我可能在这里也错了。
所以我将这个jar的路径添加到类路径中,如c++所示:

options[0].optionString = "-Djava.class.path=C:\\Users\\anker\\source\\repos\\mc_solver\\target\jars\\package_name.jar";

他的程序如下:

...
    JavaVM *jvm;                    
    JNIEnv *env;                      

    JavaVMInitArgs vm_args;                        
    JavaVMOption* options = new JavaVMOption[1];  
    options[0].optionString = "-Djava.class.path=C:\\Users\\anker\\source\\repos\\mc_solver\\target\jars\\package_name.jar";
    vm_args.version = JNI_VERSION_1_8; 
    vm_args.nOptions = 1;               
    vm_args.options = options;
    vm_args.ignoreUnrecognized = false;    
    jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);  
    delete options;    // 
    if (rc != JNI_OK) {
        cin.get();
        exit(EXIT_FAILURE);
    }
    //=============== Display JVM version =======================================
    cout << "JVM load succeeded: Version ";
    jint ver = env->GetVersion();
    cout << ((ver >> 16) & 0x0f) << "." << (ver & 0x0f) << endl;

    jclass cls2 = env->FindClass("package_name/class_name"); 
    if (cls2 == nullptr) {
        if (env->ExceptionOccurred()) {
            env->ExceptionDescribe();
        }
        cerr << "ERROR: class not found !";
    }
...

以及 env->ExceptionDescribe(); 告诉我:

Exception in thread "main" java.lang.NoClassDefFoundError: package_name/class_name
Caused by: java.lang.ClassNotFoundException: package_name.class_name
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)

非常感谢您的关注,您有什么建议?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题