2011-08-10 3 views
0

私のJavaコードでは、getCustomCode()メソッドでMyExceptionクラス(Exceptionクラスを拡張)を作成します。Android - JNI - JNIによるMyExceptionメンバーの復旧

私のC++コードでは、MyExceptionをスローするJavaメソッドを呼び出すと、例外を適切に処理するためにこの例外のgetCustomCodeを実行する必要があります。私はこのコードでMyExceptionをスローするJavaメソッドを実行することを達成するために

jint result = env->CallIntMethodA(javaObj, methodId, params); 

右この行の後に、私はこのコードでJavaExceptionをチェック:私がしようとすると、

jthrowable exc = env->ExceptionOccurred(); 
if(exc) 
{ 
    jclass objCls = env->FindClass("com/mycompany/myapp/exception/MyException"); 
    jmethodID codeMethod = env->GetMethodID(objCls, "getCustomCode", "()I"); 
    if(!objCls || !codeMethod){ ........ } 
    // Try to execute getCustomCode java method. 
    jint codeResult = env->CallIntMethod((jobject)exc, codeMethod); 
    ... 
    ... 
} 

しかし、 JNIを介してgetCustomCodeを実行すると失敗します。 私はJNIメソッドIsAssignableFromとIsInstanceOfでいくつかのチェックをした結果だった:

jclass objCls = env->FindClass ("com/mycompany/myapp/exception/MyException"); 
jclass objThrowable = env->FindClass ("java/lang/Throwable"); 
if(env->IsAssignableFrom(objCls, objThrowable) == JNI_TRUE) { /* TRUE! */ } 

私のクラスが正しいので条件は、trueを返し。 別のチェック:

jclass objCls = env->FindClass ("com/mycompany/myapp/exception/MyException"); 
jclass objThrowable = env->FindClass ("java/lang/Throwable"); 
if(env->IsInstanceOf((jobject)exc, objCls) == JNI_TRUE) { /* FALSE */ } 
if(env->IsInstanceOf((jobject)exc, objThrowable) == JNI_TRUE) { /* FALSE */ } 

両方の条件がfalseを返され、そうMyExceptionもThrowableのどちらもEXCクラスです!

したがって、jthrowableオブジェクトとは何ですか?また、jthrowableオブジェクトをjobjectにキャストしてMyExceptionメンバーにアクセスするにはどうすればよいですか? 可能ですか?

ありがとうございました!

答えて

0

ほとんどの場合、あなたはthis pageのセクション6.2.2を参照して、例外がアクティブな状態であなたが最もJNIメソッドを呼び出すことが許可されていないなどenv->FindClass(...)env->ExceptionClear()を呼び出す必要があります。保留中の例外がある場合に許可される機能のリスト:

ExceptionOccurred 
ExceptionDescribe 
ExceptionClear 
ExceptionCheck 
ReleaseStringChars 
ReleaseStringUTFchars 
ReleaseStringCritical 
Release<Type>ArrayElements 
ReleasePrimitiveArrayCritical 
DeleteLocalRef 
DeleteGlobalRef 
DeleteWeakGlobalRef 
MonitorExit