Java 有没有一种方法可以使用JNI调用本机主函数?
我不知道这是否可行,但是有没有一种方法可以使用JNI(java本机接口)使用.java文件调用.c文件的主函数?比如说 伪代码:Java 有没有一种方法可以使用JNI调用本机主函数?,java,c,java-native-interface,calling-convention,Java,C,Java Native Interface,Calling Convention,我不知道这是否可行,但是有没有一种方法可以使用JNI(java本机接口)使用.java文件调用.c文件的主函数?比如说 伪代码: /*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 mai
/*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[]作为本机函数的参数时会出错。但我希望这能让我明白我在做什么。
任何帮助都将不胜感激。最终可以调用本机main()函数,但不可能直接从Java调用,原因有二: 1) JNI函数必须符合特定的命名方案,该方案对它们在Java包/类层次结构中的位置进行编码 2) JNI函数只能具有特定的java兼容数据类型作为参数和返回值 您的解决方案是使用JNI兼容的参数和返回类型创建一个JNI兼容的函数,该函数将参数和调用从函数体中转换为普通的本机main()函数
您还需要考虑,主()函数是否与JVM兼容。如果main()只是做了一些工作,然后返回,那么它可能会是。但是如果它可能最终调用exit(),那么将结束承载jvm的进程。如果main不能很快返回,您可能需要从一个线程中完成这一切,或者在JNI调用之前在java端创建,或者在JNI兼容函数的本机端创建,并让它启动的线程调用main()。
问得好,我看不出为什么不可能。。。这是一个类似于其他函数的函数。但这样做很奇怪。使用ProcessBuilder
不是更简单吗?也许您可以使用本机mainAdapter(int-argc,char[][]argv)
,它将argv
固定或复制到指针,然后调用main
。