Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Linux/Unix ::  jar aus C starten geht nicht     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
javaausc
Unregistrierter




Beitrag javaausc Unregistrierter 16:15:27 23.02.2010   Titel:   jar aus C starten geht nicht            Zitieren

Hallo
ich versuche in einem C Programm ein java jar zu starten (unter Linux).
Leider klappt das nicht.

Code:
// params, s.u.
ret = execl( buf, buf, processargs, (char*) 0x0 );
Code:
// params, s.u.
ret = execl( buf, buf, processargs, (char*) 0x0 );
Code:
// params, s.u.
ret = execl( buf, buf, processargs, (char*) 0x0 );


Die Ausgaben von strerror und errno ergeben folgendes:
Zitat:

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?
SG1
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.03.2001
Beiträge: 2438
Beitrag SG1 Mitglied 16:30:45 23.02.2010   Titel:              Zitieren

Du übergibst 1 Parameter, willst aber 2 übergeben.
C++ Forumbot
Forumbot

Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 16158
Beitrag C++ Forumbot Forumbot 16:50:43 23.02.2010   Titel:              Zitieren

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.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
javaausc
Unregistrierter




Beitrag javaausc Unregistrierter 17:53:00 23.02.2010   Titel:              Zitieren

ok, danke, mit folgendem code geht's:
Code:
execl( "java", "java", "-jar", "./Hello.jar" );
Code:
execl( "java", "java", "-jar", "./Hello.jar" );
Code:
execl( "java", "java", "-jar", "./Hello.jar" );


Ist exec() und execl() wirklich rein Linux spezifisch?
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 22819
Beitrag rüdiger Moderator 18:37:00 23.02.2010   Titel:              Zitieren

javaausc schrieb:
ok, danke, mit folgendem code geht's:
Code:
execl( "java", "java", "-jar", "./Hello.jar" );
Code:
execl( "java", "java", "-jar", "./Hello.jar" );
Code:
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).

_________________
.
javaausc
Unregistrierter




Beitrag javaausc Unregistrierter 20:58:13 23.02.2010   Titel:              Zitieren

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!!!! :confused:
javaUndC
Unregistrierter




Beitrag javaUndC Unregistrierter 11:30:15 09.03.2010   Titel:              Zitieren

Hallo,

Ich habe ein Program "Hello.jar" im selben Verzeichnis liegen wie folgendes Program.
Zitat:

$ 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:
Zitat:

$ ./start.exe
Exception in thread "main" java.lang.NoClassDefFoundError: //Hello/jar
Caused by: java.lang.ClassNotFoundException: ..Hello.jar
at java.net.URLClassLoader$1.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.Launcher$AppClassLoader.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:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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? :confused:
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 22819
Beitrag rüdiger Moderator 12:58:12 09.03.2010   Titel:              Zitieren

Zitat:
The array of pointers must be terminated by a NULL pointer.


und das ganze strdup sollte unnötig sein.

_________________
.
javaUndC
Unregistrierter




Beitrag javaUndC Unregistrierter 14:52:41 09.03.2010   Titel:              Zitieren

Ok, sieht dann so aus, und klapp! Kuerzer ist es auch. Super ;)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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;
}
C/C++ Forum :: Linux/Unix ::  jar aus C starten geht nicht   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.