我創建了一個C++類,應該通過以下方式調用Main.main
:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp9502。從JNI調用main方法失敗
我沒有得到它的工作,所以我也跟着:http://www.coderanch.com/t/525082/CPP/create-JVM-native-code-call
和:
imp_JNI_Crea「> http://www.codeproject.com/Questions/263687/Linker-error-undefined- 。參考-TO-小鬼 _JNI_Crea
它們都沒有工作,所以我改變了我的代碼,回到了由Oracle調用API文章說(第一個鏈接)
我的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
。
我沒有看到在C++代碼的任何地方,你居然*電話*了'的Java類的main'方法?你只是提取它。 –
關於崩潰,您從不做任何類型的失敗檢查。 –
我知道,但只是單單這樣做而崩潰。我確實叫它,但它甚至沒有到達被叫線路。它只是用提取它的奇怪結果來崩潰我的程序。 MainClass在FindClass(「loader.Main」)後爲0 我刪除了所有的錯誤檢查以便於閱讀。 – Brandon