从 linux 中的 c 程序调用 java 程序

call a java program from c program in linux

在 CentOS 7 服务器上,我有一个 java 程序 /path/to/parent/bin/mainpackage/SendText.class,当我从位于 /path/to/parent/bin 的 c 程序使用以下语法调用它时,它可以完美运行:

system("java -cp .:\"/path/to/parent/dependencies/*\" mainpackage.SendText username pincode");  

但问题是c程序无法定位到/path/to/parent/bin。相反,c 程序必须位于 /path/to/parent/ 中。 如何更改语法,以便 java 程序在从 /path/to/parent/ 调用时将 运行?

这是我到目前为止所做的设置:

java 程序是使用命令

/path/to/anotherparent/ 编译而来的
javac -d bin -cp .:/path/to/anotherparent/dependencies/twilio-java-sdk-3.4.5.jar:/path/to/anotherparent/dependencies/httpcore-4.1.2.jar SendText.java

然后我创建了目标并将 SendText.class 及其依赖项复制到目标,如下所示:

[user@domain somedir]$ mkdir /path/to/parent/bin/
[user@domain somedir]$ mkdir /path/to/parent/bin/mainpackage
[user@domain somedir]$ sudo cp /home/username/javacode/bin/mainpackage/SendText.class /path/to/parent/bin/mainpackage
[user@domain somedir]$ sudo mkdir /path/to/parent/dependencies
[user@domain somedir]$ sudo cp -R /home/username/javacode/dependencies/* /path/to/parent/dependencies

接下来,我在/path/to/parent/中创建了c程序atest.c,如下所示:

[user@domain somedir]$ cd /path/to/parent
[user@domain parent]$ sudo nano atest.c

int main (void){
    char jcmd[256] = "java -cp .:\"/path/to/parent/dependencies/*\" mainpackage.SendText username pincode";
    printf(jcmd);
    system(jcmd);
    return 0;
}

Ctrl-X to save the program  

我编译了 c 程序并尝试从 /path/to/parent/ 运行 它如下:

[user@domain parent]$ sudo cc atest.c -o atest
[user@domain parent]$ ./atest
Error: Could not find or load main class mainpackage.SendText
java -cp .:"/path/to/parent/dependencies/*" mainpackage.SendText username pincode

为了确认问题出在 c 文件的位置,我做了以下操作:

[user@domain parent]$ sudo cp atest bin
[user@domain parent]$ cd /path/to/parent/bin
[user@domain bin]$ ./atest

/path/to/parent/bin

成功编程 运行s

那么,当使用命令 ./atest/path/to/parent/ 调用程序时,为了使 java 程序成功变为 运行,我需要更改什么? ]?

javac -d bin ...

这意味着 bin 作为绝对路径,当您 运行 它时,它必须出现在 CLASSPATH 中。更好的是,为 bin 的内容创建一个 JAR 文件,随时放置,并在执行时提供 JAR 文件的绝对路径作为 CLASSPATH 元素。