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 文件和一些文件位置有关。抱歉打扰了!
所以我有一些 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 文件和一些文件位置有关。抱歉打扰了!