2011-08-17 109 views
2

我試圖調用從C我​​的java類++(MS VC 2008)用JNI,但問題是,findClass的工作時,纔會有我的java類是不被導入的包。如果我添加任何包(例如java.lang.String或java.io.File),則FindClass失敗並返回任何值。爲什麼?JNI findClass的失敗,進口

C++代碼://///////////////////////////////////

JNIEnv *env; 
JavaVM * jvm; 
JavaVMInitArgs vm_args; 
JavaVMOption options; 
options.optionString = "-Djava.class.path=c:\\mypackage.jar"; 
vm_args.version = JNI_VERSION_1_6; 
vm_args.nOptions = 1; 
vm_args.options = &options; 
vm_args.ignoreUnrecognized = 0; 

int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args); 
if(env == NULL) 
    printf("\nJVM Failed\n");  

jclass cls = env->FindClass("mypackage/test/MyClass"); 

if(cls==0) 
{ 
printf("\nFindClass Failed\n"); 
} 

Java代碼://///////////////////////////////////

package mypackage.test; 

import java.io.File; //if I comment this row, FindClass works... 

public class MyClass { 

} 

更新:

這是我的代碼:http://www.sendspace.com/file/233tfm

  • 副本在C:\ JNITest
  • 更改屬性的工作目錄\項目
  • 支票JNI_test1.cpp的optionString

千恩萬謝的調試設置, 裏卡多

+0

它只是沒有找到任何東西或引發一些例外?如果你嘗試FindClass(「java.io.File」),會發生什麼? –

+0

jclass cls = env-> FindClass(「java/io/File」);工作,但我需要在我的java類中導入java.io.File – Riccardo

+0

你可以發佈你的代碼,因爲它現在是 – jogabonito

回答

0

我已經找到了問題。如果我在Eclipse \ Jar Export \中選擇了「導出生成的類文件和資源」選項,並且我在我的java類中添加了一些導入,則生成的JAR文件將不包含任何.class文件。相反,選項「導出已檢查項目的所有輸出文件夾」隨時可用。我不知道爲什麼,但我會調查。

0

我猜這可能是因爲在創建JVM時,您的類路徑僅爲c:\ mypackage.jar。我認爲系統類路徑必須指定。類路徑可以設置爲options.optionString = 「-Djava.class.path = C:\ mypackage.jar; C:\ jdk1.6.0_18 \ JRE \ lib中\ rt.jar中」;基於這樣的rt.jar是你的系統上,請改變....

+0

很好的建議,但它不工作:(其他 – Riccardo

+0

建議?謝謝... – Riccardo

+0

我發現這個問題,如果我在Eclipse \罐出口選擇\選擇「導出生成的類文件和資源」,我把一些進口在我的Java類生成的JAR文件將不包括任何的.class我不知道爲什麼,但我會調查。 – Riccardo

0

虛擬機無法找到的rt.jar和所有其他類。在設置其他選項之前,此question建議運行JNI_GetDefaultJavaVMInitArgs(&vm_args);

+0

它doe sn't工作:( – Riccardo

+0

@Riccardo:我想我的Linux機器上運行該代碼,它似乎很好地工作,唯一的變化是,在'JNI_CreateJavaVM'你應該通過'&jvm',而不是'jvm'。 –

+0

謝謝你...所以這個問題可能與系統(類路徑,路徑或類似的)有關...... – Riccardo