Java-程序在通过 JNI 从 C++ 调用后提前终止且没有错误消息

Java-Program terminating early without error-message after being called from C++ via JNI

所以我有一些 java-我想通过 JNI 从 C++ 调用的代码。这是通过以下代码完成的:

int main(int argc, char **argv) {

    JavaVM * jvm;
    JNIEnv* env = create_vm(&jvm);
    invoke_class( env );
}

JNIEnv* create_vm(JavaVM ** jvm) {
    JNIEnv* env;
    JavaVMInitArgs vm_args;
    JavaVMOption options;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    options.optionString = "-Djava.class.path=<path_to_java_class>:<path_to_jars>";
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = JNI_FALSE;

    int ret = JNI_CreateJavaVM(jvm, (void **)&env, &vm_args);
    if(ret < 0)
        printf("\nUnable to Launch JVM\n");
    return env;
}

void invoke_class(JNIEnv* env) {
    jclass helloWorldClass;
    helloWorldClass = env->FindClass("A");

    if (env->ExceptionCheck()){
        std::cout << "EXCEPTION OCCURED: " << std::endl;
        env->ExceptionDescribe();
    }
}

call_main(env, helloWorldClass);

void call_main(JNIEnv* env, jclass hClass){
    jmethodID mainMethod;
    jobjectArray applicationArgs;
    jstring applicationArg0;
    jstring applicationArg1;
    mainMethod = env->GetStaticMethodID(hClass, "main", "([Ljava/lang/String;)V");

    applicationArgs = env->NewObjectArray(2, env->FindClass("java/lang/String"), NULL);
    applicationArg0 = env->NewStringUTF("planes.txt");
    applicationArg1 = env->NewStringUTF("out.txt");
    env->SetObjectArrayElement(applicationArgs, 0, applicationArg0);
    env->SetObjectArrayElement(applicationArgs, 1, applicationArg1);

    env->CallStaticVoidMethod(hClass, mainMethod, applicationArgs);
}

对应的Java-调用的代码如下:

public class A{
    import org.mindswap.pellet.jena.PelletReasonerFactory;
    import com.hp.hpl.jena.rdf.model.ModelFactory;

    private OntModel model = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC);

    public A() {        
        System.out.println("hi2");
    }

    public static void main(String[] args) throws Exception {

        System.out.println("hi1");

        A app = new A();

        long start = System.currentTimeMillis();
        long stop = System.currentTimeMillis();
        System.out.println("Processing took " + (stop - start) + " ms");
        System.out.println("Normal program end.");
    }
}

好的,如果我现在执行 C++ 代码,我会得到以下输出:

hi1

没有任何错误消息,程序正确终止。但是,我希望输出类似于:

hi1
hi2
Processing took 0ms
Normal program end.

似乎调用构造函数并没有发生,之后的代码根本没有执行。

但是,如果我删除该行

private OntModel model = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC);

输出正确。

既然忽略了这不是一个选项,这里发生了什么?尽管程序根本不应该完成,但它怎么可能在没有错误消息的情况下终止?

我试过输入类似 Thread.sleep(10000) 的内容,看看它是否与给定呼叫所花费的时间有关,但这似乎根本不是问题。

编辑:抱歉,我忘了更改 class-名称。 EDIT2:我应该提到 java-code ist 运行 在没有从 C++ 环境中调用时完全没问题

问题已解决。它与 jar 文件和一些文件位置有关。抱歉打扰了!