繁体   English   中英

JNI C ++为什么也需要.class和.jar?

[英]JNI C++ Why do I need .class and .jar also?

我有一个非常简单的代码,可以通过C ++通过JNI调用JAVA函数,但是,只有在我提供编译后的.class文件和捆绑的.jar文件的情况下,它才有效。 如果删除其中任何一个,我的应用程序将停止工作。 示例代码:

void JniProvider::CreateVM(const QString compiledSource, const QString jar) throw(std::runtime_error) {
    QString     classpath   = QString("-Djava.class.path=%1;%2").arg(compiledSource).arg(jar);
    QByteArray  cpbytes     = classpath.toLocal8Bit();
    char*       chrpath     = cpbytes.data();
    // VM Arguments size:
    const int optionsSize = 2;
    // jvm options:
    JavaVMOption options[optionsSize];
                 options[0].optionString = "-Djava.compiler=NONE";
                 options[1].optionString = chrpath;
    // jvm args
    JavaVMInitArgs vm_args;
                   vm_args.version             = JNI_VERSION_1_6;
                   vm_args.nOptions            = optionsSize;
                   vm_args.options             = options;
                   vm_args.ignoreUnrecognized  = JNI_TRUE;
    // startup jvm
    jint responseCode = JNI_CreateJavaVM(&virtualMachine, reinterpret_cast<void**>(&environment), &vm_args);
    if (responseCode < 0) {
        virtualMachine->DestroyJavaVM();
        throw std::runtime_error("Failed to create Java virtual machine.");
    }
}

注意类路径行。 如果删除jar,则无法通过jni调用任何函数。 当我再次设置它时,一切正常。 我是否还需要编译后的源代码和混乱的jar(带有依赖项jars)的预期功能?

@Edit:谢谢您的答复。 请允许我在一处阐明一些弹出的问题。 因此,Java项目在Netbeans 7.4中具有以下结构:

Core
 Source Packages
  core
   Core.java
  model
   model.java
 Test Packages
 Libraries
  enttoolkit.jar
  mail.jar
  wm-isclient.jar

如您所见,我有三个依赖项作为外部jar文件。 不管我喜不喜欢,Java应用程序都使用这些。 编译后,以下结构将出现在项目的dist文件夹中:

lib
 enttoolkit.jar
 mail.jar
 wm-isclient.jar
Core.jar
 core
  core.class
 META-INF
  MANIFEST.MF
 model
  model.class

我有Core.jar,里面有已编译的类,还有一个带有外部jar文件的lib文件夹。

现在到实际有问题的部分。 如果稍后在env-> Findclass上从CreateVM函数的类路径中删除.class或.jar文件,则会失败。 它只是找不到任何类,如果我同时提供了类文件和jar文件,那么它将成功,并且我可以从类中调用任何方法,无论是否为静态。

MANIFEST.MF内容:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.1
Created-By: 1.7.0_25-b17 (Oracle Corporation)
Class-Path: lib/enttoolkit.jar lib/mail.jar lib/wm-isclient.jar
X-COMMENT: Main-Class will be added automatically by build
Main-Class: core.Core

@Edit(10:30):错误为NoClassDefFoundError。 编译源的值是.class文件(包括类文件本身)的路径,而jar与jar文件相同。 例如:

"-Djava.class.path=C:/Users/johorvat/AppData/Local/Temp/resource.class" <- The upper NoClassDefFoundError
"-Djava.class.path=C:/Users/johorvat/AppData/Local/Temp/resource.class;C:/Users/johorvat/AppData/Local/Temp/resource.jar" <- Works flawlessly without any errors and produces Java method return values on C++ side.

如果我忽略了类文件并仅使用jar,则会发生相同的情况。 仅当我同时拥有它们或获取NoClassDefFoundError时,它才有效。 对我来说有点奇怪

不需要。您只需要提供正确构建的JAR文件 .class文件的层次结构即可。 我建议您的jar文件中缺少某些内容,或者使用了错误的名称或目录。

请注意,NoClassDefError与ClassNotFoundException不同。 这意味着找到文件但其中不包含预期的类,例如,大小写错误或程序包错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM