2013-07-02 68 views
2

我不知道這是否可行,但有沒有辦法使用JNI(Java Native Interface)使用.java文件調用.c文件的主要功能?例如有沒有辦法使用JNI調用本地主函數?

僞代碼:再次

/*This is the .c file*/ 
int main(int argc, char* argv[]){ 

    File pFile; 
    pFile = fopen(argv[1],"r"]); 
    fclose(argv[1]); 
} 

僞代碼:

/*This is the .java file*/ 

public class maincpy{ 

    static 
    { 
     System.loadLibrary("maincpy"); 
    } 

    public native int maincpy(int argc, char* argv[]); // 

    public static void main(String[] args){ 
     maincpy c = new maincpy(); 
     c.main(2,"somefile.txt"); 
    } 
} 

我知道我寫的是不正確的,因爲我得到的錯誤使用的char * argv的[]作爲一個參數本地功能。但是我希望這可以讓我想到我想要做的事情。 任何幫助,將不勝感激。

+0

好問題,我不明白爲什麼它不應該是可能的...這是一個像其他任何功能。但這是一件奇怪的事情。使用「ProcessBuilder」不是更簡單嗎? – fge

+0

也許你可以有一個'本地mainAdapter(int argc,char [] [] argv)',將'argv'引腳或複製到一個指針,然後調用'main'。 – johnchen902

回答

1

它有可能最終調用本機main()函數,而不是AFAIK可能因此直接從Java做,有兩個原因:

1)JNI函數必須符合編碼,其中特定的命名方案他們倒在Java包/類層次結構

2)JNI函數只能有特定的Java兼容的數據類型作爲參數和返回值

您的解決方案是使用JNI兼容參數的JNI兼容的功能,返回類型,它將參數和調用轉換爲正常ary原生main()函數來自它的主體。

您還需要考慮main()函數是否與jvm兼容。如果main()只是做了一些工作,然後返回它可能會。但是如果它最終可能會調用exit()來結束託管jvm的進程。如果main不會很快返回,你可能需要從一個線程完成這一切,這個線程可以在JNI調用之前在java端創建,也可以在JNI兼容函數的本地端創建,然後讓它開始的線程調用main ()。

相關問題