假設我有一個Java類是這樣的:JNI INT方法從外返回
假設,把foo()方法做一些JNI調用,而這些調用的一個失敗(IE,拋出一個異常)。然後,我想從JNI代碼返回並拋出Java中拋出的異常。例如:
jint Java_Test_foo(JNIEnv* env, jobject thiz)
{
jstring foobar = (*env)->NewStringUTF(env, "Hello from JNI !");
if(foobar == NULL) // Not enough memory. OutOfMemoryError is thrown
return NULL; // Return immediately to get exception thrown in Java
// Do other stuff
...
return some_computed_jint;
}
問題是return NULL
不是jint。以Android爲例,編譯時會出現這樣的警告: 警告:返回從指針中取得整數而沒有轉換。
現在的問題是:如果在返回jint的JNI方法中拋出異常,應該返回什麼?
所以你說Java(不在JNI下)返回值並不重要,當拋出一個異常。這是真的,因爲當拋出異常時,java方法永遠不會到達return語句。我和你在那裏。 但是你是否在說如果我調用一個「拋出」異常的JNI方法,並且我沒有使用ExceptionClear清除它,那麼無論我從JNI返回什麼,返回到Java時都會拋出異常?如果是,那麼我可以返回任何jint,並且jint在Java端永遠不可見,對吧? – foens
是的,這是正確的。 –