2012-08-22 44 views
2

我在Maven項目中運行良好的WebApp(WAR文件)。如何在Maven項目中從C運行java類文件

我想從C文件中調用maven項目中的類文件中的Java方法。 C程序讀取beagleboard的GPIO輸入,當它打開時,它運行Java方法。我使用JNI來做到這一點。

我可以運行一個經典的HelloWorld Java方法,但是當我想從我的Maven項目運行一個方法時,當它嘗試加載Java靜態方法時,我的JVM出現致命錯誤。

我添加的C代碼在我的Web應用程序,在/ WEB-INF/MyApp的/類/類文件/

類文件:應用程序 方法:測試

我的C程序:

JNIEnv* create_vm(JavaVM ** jvm) { 

    JNIEnv *env; 
    JavaVMInitArgs vm_args; 
    JavaVMOption options; 
    //Path to the java source code 
    options.optionString = "-Djava.class.path=./"; 
    //JDK version. This indicates version 1.6 
    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(ret < 0) 
     printf("\nUnable to Launch JVM\n"); 
    return env; 
} 


int main(int argc, char** argv) 
{ 
    int fd, ret, data[64]; 
    JNIEnv *env; 
    JavaVM * jvm; 
    env = create_vm(&jvm); 
    if (env == NULL) 
     return 1; 

    fd = ret = open(argv[argc - 1], O_RDONLY); 
    printf("open returned %d\n", ret); 
    while (1) { 
     ret = read(fd, &data, sizeof(data)); 
     printf("read returned %d\n", ret); 
     jclass helloWorldClass = (*env)->FindClass(env, "App"); 
     printf("appel class\n"); 
     jmethodID mainMethod = (*env)->GetStaticMethodID(
      env, helloWorldClass, "test", "([Ljava/lang/String;)V"); 
     printf("appel method\n"); 
     (*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, NULL); 

     sleep(2); 
    } 
    (*jvm)->DestroyJavaVM(jvm); 
    exit(0); 
} 

Java類:

package App; 
public class App 
{ 
    public static void test (String[] args){ 
     System.out.println("Hello World"); 
    } 
} 
+0

+1的beagleboard - 你應該添加標籤,順便說一句。 – noahlz

回答

0

你有沒有調查d使用 Reverse JNI

我注意到你有下面這行:

options.optionString = "-Djava.class.path=./"; //Path to the java source code

類路徑需要以指向Maven的生成jar文件,或在其Java類文件所在的根目錄。

見:Setting the ClassPath

在一個標準的Maven項目,Maven將target/下創建罐子,當你執行mvn package。所以你可能會改變-Djava.class.path=./-cp /target/App.jar

+0

反向JNI是我使用的。但是我無法運行Maven項目中的Java App:/ – Yeka

相關問題