2009-03-10 21 views
1

Aşağıdaki java kodunu JNI:JNI istisnalarını işlemek için basit kod

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

olarak ifade etmenin güzel ve düzenli bir yolunu kullanmak istiyorum. Bunu yapmak için düzenli bir JNI patter var mı? Şu anda, bende var:

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(); 
} 

Ve tabi ki, bu durum her bir istisna için yeniden ele alınıyor. Daha iyi bir yolu olmalı. Herhangi bir tavsiye? Varolan kodların tümünü JNA'ya aktarmakla ilgilenmiyorum, bu yüzden konuşmak için evde yetiştirilebilecek bir desen istiyorum.

+0

JNI kodunuz için C veya C++ kullanıyor musunuz? – Alnitak

+0

kazıma, sadece düz C. FWIW kullandığınızı görüyorum, JNI kendi deneyimim bana, RAI modelinde C++ nesneleri kullanmanın JNI ile çok yardımcı olduğunu gösterdi. şeyler kapsam dışına çıktığında otomatik olarak temizlemeyi kolaylaştırır. – Alnitak

cevap

1

C++ C++ hakkındaki yorumumu genişletmek için.

Ben C böyle bir şey denemek istiyorum ++ (nb: olduğu gibi muhtemelen tamamen denenmemiş ve derleme değil!)

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); 
     } 
}; 

istemci kod sonra benzer görünümde olacaktır:

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(); 
    } 
} 

(Bu isInstanceOf() işlevinin anlamsallığının bas-ackwards olduğunu unutmayın - bunun içinde "class.instanceof(object)" yerine "object instanceof class").

+0

Açıkçası, benim programlama dili C :) –

+0

oh tarafından işe yaramaz hale getirilen güzel bir çözüm, oh, herkes memnun edemezsiniz :) – Alnitak

-1

daha iyi bir yolu

Şablon desen olmalı, olabilir?