Question

Je voudrais avoir une façon agréable et ordonnée d’exprimer le code Java suivant en JNI:

try {
    SomeMethod ();
}
catch (ExceptionType1 e) {
    SomeAction ();
}
catch (ExceptionType2 e) {
    SomeAction ();
}
catch (ExceptionType3 e) {
    SomeAction ();
}

Existe-t-il un modèle JNI bien rangé pour ce faire? À l'heure actuelle, j'ai ceci:

java_class = (*env)->FindClass (env, EXCEPTION_CLASS_NAME);
if (java_class == NULL) {
    *error_type_ref = ERROR_TYPE_FATAL;
    *exception_code_ref = EU_StrSprintf ("Class not found: %s", EXCEPTION_CLASS_NAME);
    cleanup ();
}
if ((*env)->IsInstanceOf (env, exception, java_class)) {
    SomeAction ();
    cleanup ();
}

Et, bien sûr, cela se reproduit pour chaque exception ainsi gérée. Il doit y avoir une meilleure façon. Des recommandations? Je ne suis pas intéressé par le portage de la totalité de mon code existant sur la JNA. Je souhaiterais donc un modèle qui puisse être implémenté en interne, pour ainsi dire.

Était-ce utile?

La solution

Pour développer mon commentaire sur le C vs C ++.

Je voudrais essayer quelque chose comme ça en C ++ (nb: complètement non testé, et ne compile probablement pas tel quel! )

class JavaClass {

    private:
        jclass cls;
        JNIEnv *env;

    public:
        JavaClass(JNIEnv *env, const char *className) {
            this.env = env;
            cls = env->FindClass(className);
            // handle errors
        }

        ~JavaClass() {
            env->DeleteLocalRef(cls);
        }

        bool isInstanceOf(jobject obj) {
            return env->IsInstanceOf(obj, cls);
        }
};

Le code client ressemblerait alors à quelque chose comme:

JavaClass ext1(env, "ExceptionType1");
JavaClass ext2(env, "ExceptionType2");
JavaClass ext3(env, "ExceptionType3");

SomeMethod();

if (ex = env->ExceptionOccurred()) {
    if (ext1.isInstanceOf(ex)) {
        doSomething();
    } else if (ext2.isInstanceOf(ex)) {
        doSomething();
    } else if (ext3.isInstanceOf(ex)) {
        doSomething();
    }
}

(Notez que la sémantique de cette fonction isInstanceOf () est bass-ackwards - dans celui-ci, il s'agit de " class.instanceof (objet) ", au lieu de " instance d'objet de la classe ").

Autres conseils

  

Il doit y avoir un meilleur moyen

Modèle de modèle, peut-être?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top