有没有办法使用JNI调用本机主函数?

时间:2013-07-02 15:06:05

标签: java c java-native-interface calling-convention

我不知道这是否可能,但有没有办法使用JNI(Java Native Interface)使用.java文件调用.c文件的main函数?例如

伪代码:

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

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

Psuedocode:

/*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 []作为本机函数的参数会出错。但我希望这可以解决我想要做的事情。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

最终可以调用本机main()函数,但不能直接从Java中调用,原因有两个:

1)JNI函数必须符合特定的命名方案,该方案对它们落入Java包/类层次结构的位置进行编码

2)JNI函数只能将特定的java兼容数据类型作为参数并返回值

您的解决方案是使用JNI兼容的参数和返回类型创建JNI兼容函数,该函数将参数和调用转换为其正文中的普通本机main()函数。

您还需要考虑main()函数的作用是否与jvm兼容。如果main()只是做了一些工作然后返回它可能会。但是如果它可能最终调用exit()来结束托管jvm的进程。如果main不会很快返回,你可能需要从一个线程完成这一切,在JNI调用之前在java端创建,或者在JNI兼容函数的本机端创建,并让它开始的线程调用main ()。