2

我不知道这是否可能,但有没有办法使用 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 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[] 作为本机函数的参数时出现错误。但我希望这能让我明白我想做的事情。任何帮助,将不胜感激。

4

1 回答 1

1

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

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

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

您的解决方案是使用 JNI 兼容的参数和返回类型创建一个 JNI 兼容的函数,它将参数和调用从其主体内转换为普通的本机 main() 函数。

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

于 2013-07-02T15:14:01.260 回答