2013-07-02 69 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 ()。

相关问题