Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Java » Jrockit Problem.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.02.2004, 17:13 Uhr
virtual
Sexiest Bit alive
(Operator)


Hallo,
ich habe da ein dickes Problem, wenn ich JNI_CreateJavaVM von BEAs JRockit in einer Multithreaded Application verwende (andere SDK Implementation arbeiten einwandfrei):

Zunächst mal, was funktioniert:

C++:
#include "jni.h"
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void jnicall()
{
        JNIEnv *env;
    JavaVM *jvm;
    jint res;
    jclass cls;
    jmethodID mid;
    jstring jstr;
    jclass stringClass;
    jobjectArray args;
    JavaVMInitArgs vm_args;
    JavaVMOption options[1];
    options[0].optionString = "-Djava.class.path=.";
    vm_args.version = 0x00010002;
    vm_args.options = options;
    vm_args.nOptions = 1;
    vm_args.ignoreUnrecognized = JNI_TRUE;
     res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

     if (res < 0) {
         fprintf(stderr, "Can't create Java VM\n");
         exit(1);
     }
     cls = env->FindClass("Hello");
     if (cls == NULL) {
         goto destroy;
     }

     mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
     if (mid == NULL) {
         goto destroy;
     }
     jstr = env->NewStringUTF(" from C!");
     if (jstr == NULL) {
         goto destroy;
     }
     stringClass = env->FindClass("java/lang/String");
     args = env->NewObjectArray(1, stringClass, jstr);
     if (args == NULL) {
         goto destroy;
     }
     env->CallStaticVoidMethod(cls, mid, args);

destroy:
     if (env->ExceptionOccurred()) {
         env->ExceptionDescribe();
     }
     jvm->DestroyJavaVM();
}


int main()
{
        jnicall();
}


Die richtige Class Datei vorausgesetzt, läuft das Programm einwandfrei (die gotos bitte ich zu entschuldigen, sind aus dem JNI Tutorial, welches eigentlich nur schlechten C/C++ Code enthält).

Wenn ich nun main ersetze duch:

C++:
int main()
{
        pthread_t thread;

        if (0 != pthread_create(&thread, NULL, (void*(*)(void*))jnicall, NULL))
        {
                fprintf(stderr, "Cannot create thread");
                exit(1);
        }
        ...
}


bekomme ich meldung

Code:
"ERROR: Could not find the pthread library (2). Are you running a supported Linux distribution?"


Diese Meldung kommt eindeutig aus dem JNICreateJavaVM. Mit ldd kann ich aber belegen, daß sowohl die libjvm.so alsauch mein testprogramm die gleiche pthread so ziehen.

Man könnte auf Die Idee kommen, daß man JNI_CreateJavaVM bei JRockit nicht aus einem Thread heraus aufrufen darf:

C++:
int main()
{
        pthread_t thread;

        jnicall();
        if (0 != pthread_create(&thread, NULL, (void*(*)(void*))some_other_thread_without_jni, NULL))
        {
                fprintf(stderr, "Cannot create thread");
                exit(1);
        }
        ...
}


Gleicher fehler. Es scheint, als würde das schiefgehen, sobald irgendwo im Code ein pthread-Aufruf da ist.

Ach ja_
Suse Linux Enterprise Server 8.0 (mit United Linux 1.0) (kernel 2.4.19, glibc is 2.2.5); Jrockit ist JRockit 8.1 SP 2
Gemäß Doku also eine Unterstützte Kombination.

Any ideas?

TIA,
Johannes
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Java ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: