2013-06-28 111 views
3

我創建了一個C++類,應該通過以下方式調用Main.mainhttp://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

+1

我沒有看到在C++代碼的任何地方,你居然*電話*了'的Java類的main'方法?你只是提取它。 –

+0

關於崩潰,您從不做任何類型的失敗檢查。 –

+0

我知道,但只是單單這樣做而崩潰。我確實叫它,但它甚至沒有到達被叫線路。它只是用提取它的奇怪結果來崩潰我的程序。 MainClass在FindClass(「loader.Main」)後爲0 我刪除了所有的錯誤檢查以便於閱讀。 – Brandon

回答

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

這是錯誤的。使用JNI函數時,必須使用斜線而不是點,就像方法簽名一樣。

正確的代碼是:

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