2017-07-05 15 views
3

我试图从JNI调用C++的JAVA方法。首先,我得到了this的例子,试了一下。我改变了JDK的路径,之后我可以运行这些示例并正常工作。从C++使用JNI时JVM找不到类

之后,我尝试导入我自己的JAR文件并使用它的一个类。我复制从示例代码和替换类路径和类名与我自己:

void MyCPPClass::CallJava() 
{ 
    JavaVM *jvm;    // Pointer to the JVM (Java Virtual Machine) 
    JNIEnv *env;    // Pointer to native interface 

    //==================== prepare loading of Java VM ============================ 

    JavaVMInitArgs vm_args;      // Initialization arguments 
    JavaVMOption* options = new JavaVMOption[ 1 ]; // JVM invocation options 
    options[ 0 ].optionString = "-Djava.class.path=MyJar.jar"; // where to find java .class 
    vm_args.version = JNI_VERSION_1_8;    // minimum Java version 
    vm_args.nOptions = 1;       // number of options 
    vm_args.options = options; 
    vm_args.ignoreUnrecognized = false;  // invalid options make the JVM init fail 

    //================= load and initialize Java VM and JNI interface =============== 

    jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !! 
    delete options; // we then no longer need the initialisation options. 

    //========================= analyse errors if any ============================== 
    // if process interuped before error is returned, it's because jvm.dll can't be 
    // found, i.e. its directory is not in the PATH. 

    if(rc != JNI_OK) 
    { 
     exit(EXIT_FAILURE); 
    }  

    jclass cls1 = env->FindClass("aaa/bbb/MyClass"); 
    ... 
} 

的JAR只包含一个aaa.bbb.MyClass类,它与IntelliJ IDEA的和mvn package命令所做的。我将JAR文件复制到我的可执行文件旁边。

rc始终为0(JNI_OK),但cls1的值始终为NULL。我认为JVM可以找到JAR,因为当我调试时,我无法删除FindClass之后的JAR。

JAR文件包含MyClass.class文件,我检查了它。

我已经检查了一些以前的问题(1,2, 3和其他一些),但我没有得到我犯了一个错误的地方。

更新:我试图将MyClass.class文件和MyJar.jar文件复制到之前链接的示例的目录中,JVM找不到MyClass。有可能是我的java源文件中缺少的东西?包声明是正确的。

什么会导致JVM无法找到MyClass?从问题

回答

0

感动的解决方案来回答:

SOLUTION:我不得不Maven的依赖关系的JAR文件添加到类路径。现在它工作了!