我不知道这是否可能,但有没有办法使用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 []作为本机函数的参数会出错。但我希望这可以解决我想要做的事情。 任何帮助将不胜感激。
答案 0 :(得分:1)
最终可以调用本机main()函数,但不能直接从Java中调用,原因有两个:
1)JNI函数必须符合特定的命名方案,该方案对它们落入Java包/类层次结构的位置进行编码
2)JNI函数只能将特定的java兼容数据类型作为参数并返回值
您的解决方案是使用JNI兼容的参数和返回类型创建JNI兼容函数,该函数将参数和调用转换为其正文中的普通本机main()函数。
您还需要考虑main()函数的作用是否与jvm兼容。如果main()只是做了一些工作然后返回它可能会。但是如果它可能最终调用exit()来结束托管jvm的进程。如果main不会很快返回,你可能需要从一个线程完成这一切,在JNI调用之前在java端创建,或者在JNI兼容函数的本机端创建,并让它开始的线程调用main ()。