从 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 元素。
在 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
那么,当使用命令 ./atest
从 /path/to/parent/
调用程序时,为了使 java 程序成功变为 运行,我需要更改什么? ]?
javac -d bin ...
这意味着 bin
作为绝对路径,当您 运行 它时,它必须出现在 CLASSPATH 中。更好的是,为 bin
的内容创建一个 JAR 文件,随时放置,并在执行时提供 JAR 文件的绝对路径作为 CLASSPATH 元素。