jar aus C starten geht nicht
-
Hallo
ich versuche in einem C Programm ein java jar zu starten (unter Linux).
Leider klappt das nicht.// params, s.u. ret = execl( buf, buf, processargs, (char*) 0x0 );
Die Ausgaben von strerror und errno ergeben folgendes:
start process: "java" "-jar ./Hello.jar"
buf: "/usr/bin/java"
processargs: "-jar ./Hello.jar"
Unrecognized option: -jar ./Hello.jar
Could not create the Java virtual machine.Ein Befehl auf der Konsole: "java -jar ./Hello.jar" funktioniert. Was mache ich falsch?
-
Du übergibst 1 Parameter, willst aber 2 übergeben.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ok, danke, mit folgendem code geht's:
execl( "java", "java", "-jar", "./Hello.jar" );
Ist exec() und execl() wirklich rein Linux spezifisch?
-
javaausc schrieb:
ok, danke, mit folgendem code geht's:
execl( "java", "java", "-jar", "./Hello.jar" );
Jetzt hast du die 0x0 am Ende vergessen.
javaausc schrieb:
Ist exec() und execl() wirklich rein Linux spezifisch?
exec gibt's in Linux nicht
execl ist nicht in ANSI C, sondern Teil der POSIX API (die u.a. auf Linux genutzt wird).
-
Stimmt, (char*) 0x0 fehlte noch.
Ich hab ein neues Problem: ich merkte, dass "Hello", das "Hello.class" file war. Sobald ich NUR das Hello.jar File habe geht es nicht mehr.
Schlimmer noch, wenn ich nun im Aufruf statt "Hello" eben "Hello.jar" aufrufe, scheint bei Java "Hello/jar" anzukommen, das findet er nicht und nix geht. Warum ist das so? Wie kann ich aus C trotzdem auch ein jar starten?
Ich bin echt verzweifelt!!!!
-
Hallo,
Ich habe ein Program "Hello.jar" im selben Verzeichnis liegen wie folgendes Program.
$ java -jar ./Hello.jar
HelloIch will das Programm Hello.jar nun aus C heraus starten (sh. Code unten), nur dabei bekomme ich immer (noch) folgenden Fehler:
$ ./start.exe
Exception in thread "main" java.lang.NoClassDefFoundError: //Hello/jar
Caused by: java.lang.ClassNotFoundException: ..Hello.jar
at java.net.URLClassLoaderAppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: ./Hello.jar. Program will exit.Das C Programm:
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <stdarg.h> #include <errno.h> #include <unistd.h> void startexternal( const char* processname, int nargs, ...) { va_list argp; int idx=0; char **processargs=NULL; // args processargs = calloc( nargs, sizeof( *processargs ) ); va_start( argp, nargs ); for( idx=0; idx<nargs; ++idx ){ processargs[idx] = strdup( va_arg( argp, const char* ) ); } va_end( argp ); // exec if( -1 == execvp( processname, processargs ) ){ char _errmsg[256]; memset( _errmsg, '\0', 256 ); strerror_r( errno, _errmsg, 256 ); fprintf( stderr, "execution failed: \"%s\"\n", _errmsg ); } // free (never executed) for( idx=nargs-1; 0 <=idx; --idx ){ free( processargs[idx] ); } free( processargs ); } int main( int argc, char** args ) { char* processname=strdup("/usr/bin/java"); startexternal( processname, 2, "-jar", "./Hello.jar" ); return 0; }
Wo liegt mein Fehler? Oder geht das gar nicht?
-
The array of pointers must be terminated by a NULL pointer.
und das ganze strdup sollte unnötig sein.
-
Ok, sieht dann so aus, und klapp! Kuerzer ist es auch. Super
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <stdarg.h> #include <errno.h> #include <unistd.h> void startexternal( char* processname, int nargs, ...) { va_list argp; int idx=0; char **processargs=NULL; processargs = calloc( nargs+1, sizeof( *processargs ) ); processargs[0] = processname; va_start( argp, nargs ); for( idx=0; idx<nargs; ++idx ){ processargs[idx+1] = (char*) va_arg( argp, const char* ); } processargs[idx+1] = (char*) 0x0; va_end( argp ); if( -1 == execvp( processname, processargs ) ){ char _errmsg[256]; memset( _errmsg, '\0', 256 ); strerror_r( errno, _errmsg, 256 ); fprintf( stderr, "failed: \"%s\"\n", _errmsg ); } free( processargs ); } int main( int argc, char** args ) { char* processname=strdup("java"); startexternal( processname, 2, "-jar", "./Hello.jar" ); return 0; }