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
    Hello

    Ich 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.URLClassLoader1.run(URLClassLoader.java:200)atjava.security.AccessController.doPrivileged(NativeMethod)atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)atsun.misc.Launcher1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.LauncherAppClassLoader.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;
    }
    

Anmelden zum Antworten