12
I wonder if there’s a way I can write a program .jar, and write a C/C++ program that called the JVM to run the file .jar. Is it possible? If so, can you give me an example of code or an instruction on how to do this?
12
I wonder if there’s a way I can write a program .jar, and write a C/C++ program that called the JVM to run the file .jar. Is it possible? If so, can you give me an example of code or an instruction on how to do this?
10
9
The most standard solution would be using the function system() of the standard library stdlib.h.
HOWEVER, from the point of view of systems *nix, the use of system() should be avoided:
1 - The call of the function
system()executes the command interpreter (shell) which makes it much slower than the call of afork()followed by aexec();2 - It is a potential safety risk if you pass as parameter an unreliable source string;
3 - It cannot be used asynchronously, that is, the system is locked awaiting the return of the child process;
4 - The duo
fork()andexec()gives us much greater control before and between their calls.
The following program exemplifies the execution of a .jar using the calls of fork(), exec() and waitpid() in a system Linux.
Note that the process child, before making the call of exec(), prepares the environment by redirecting the output streams (STDERR and STDOUT) for two output files: stderr.txt and stdout.txt.
The flow of the parent process is blocked on purpose with the waitpid(), but could be "working" on another task:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define MAX_CMD_TAM (1024)
int main( int argc, char * argv[] )
{
char cmd[ MAX_CMD_TAM + 1 ] = {0};
/* Verifica se o nome de arquivo .jar foi passado como parametro na linha de comando */
if( argc != 2 )
{
printf("Erro de sintaxe: %s [ARQUIVO_JAR]\n", argv[0] );
return 1;
}
/* Processo pai cria uma copia de si mesmo (cria um processo filho) */
pid_t child = fork();
/* Monta a linha de comando que sera executada */
snprintf( cmd, MAX_CMD_TAM, "java -jar %s", argv[1] );
if( child == 0 ) /* Fluxo do processo filho */
{
/* Abre/Cria arquivos para substituirem as saidss padroes: STDOUT e STDERR */
int fdout = open( "stdout.txt", O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR );
int fderr = open( "stderr.txt", O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR );
/* Redireciona o STDOUT e STDERR para os arquivos correspondentes */
dup2( fdout, STDOUT_FILENO );
dup2( fderr, STDERR_FILENO );
/* Depois de duplicados, os descritores dos arquivos nao sao mais necessarios */
close(fdout);
close(fderr);
/* Executa comando */
execlp( cmd, NULL );
}
else if( child > 0 ) /* Fluxo do processo pai */
{
/* Processo pai aguarda a execucao do processo filho */
printf( "Executando Comando: \"%s\"\n", cmd );
printf( "Aguardando a execucao do processo filho...\n");
waitpid(child);
printf("Sucesso!\n");
}
else
{
printf("fork() falhou!\n");
return 1;
}
return 0;
}
/* fim-de-arquivo */
I hope I’ve helped!
Browser other questions tagged java c c++
You are not signed in. Login or sign up in order to post.
Depending on the case has the JNA also.
– Renan Gomes
Thank you. I have already found the answer in a similar question.
– Isaac Dennis