私の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メンバーにアクセスするにはどうすればよいですか? 可能ですか?
ありがとうございました!