Сбой вызова основного метода из JNI

Я создал класс C ++, который должен вызывать Main.main следующим образом: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp9502.

Я не получил его на работу, поэтому я последовал: http://www.coderanch.com/t/525082/CPP/create-JVM-native-code-call

а также :

imp_JNI_Crea «> http://www.codeproject.com/Questions/263687/Linker-error-undefined-reference-to-чертенок_JNI_Crea

Ни один из которых не работал. Таким образом, я изменил свой код обратно на то, что говорит статья API Invocation от Oracle (первая ссылка).

Мой код C ++ выглядит так:

В файле JNI.hpp:

#include <jni.h>
#include <windows.h>
#include <iostream>

class Jvm
{
private:
JavaVM* jvm;
JNIEnv* env;
JavaVMInitArgs jvm_args;
JavaVMOption* options;

public:
Jvm();
};

В файле JNI.cpp:

Jvm::Jvm()
{
options = new JavaVMOption[3];

options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=C:/Users/Brandon/Documents/NetBeansProjects/Loader/build/classes";
options[2].optionString = "-verbose:class";

jvm_args.version = JNI_VERSION_1_6;
jvm_args.nOptions = 3;
jvm_args.options = options;
jvm_args.ignoreUnrecognized = false;

//JNI_GetDefaultJavaVMInitArgs(&jvm_args);
JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &jvm_args);

jclass MainClass = env->FindClass("loader.Main");//Crashes on the next line:
jmethodID MainMethod = env->GetStaticMethodID(MainClass, "main", "([Ljava/lang/String;)V");

MessageBox(NULL, "", "", 0);

Sleep(1000);

jvm->DestroyJavaVM();
delete[] options;
}

Мой код Java выглядит так:

package loader;

public class Main {

public static void main(String[] args) {
//JavaProcess.exec(ClientApplet.class);
System.out.println("Hello!");
}
}

И подробные отпечатки:

[Loaded loader.Main from file:/C:/Users/Brandon/Documents/NetBeansProjects/Loader/build/classes/]

Process returned -1073741571 (0xC00000FD)   execution time : 1.730 s
Press any key to continue.

Что я делаю неправильно? Почему не удается вызвать метод?
JNI.dll что я загрузил это от: C:\Program Files\Java\jdk1.7.0_21\jre\bin\server\jvm.dll потому что последний Java 7u25 не имеет bin\client\jvm.dll,

Я даже статически связан с jvm.lib: C:\Program Files\Java\jdk1.7.0_21\lib\jvm.lib,

3

Решение

jclass MainClass = env->FindClass("loader.Main");

Это не верно. При использовании функций JNI вы должны использовать косые черты вместо точек, как в сигнатурах методов.

Правильный код:

jclass MainClass = env->FindClass("loader/Main");
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]