2012-11-23 64 views
0

我使用谷歌Nexus s的nfc函數來開發基於射頻卡的程序。 這裏是我的方法,我認爲這個問題是數據對象jni方法調用異常掛起getarraylength

unsigned char *CNFCFunList::jbyteArray2Byte(jbyteArray data, int *outLen) 
{ 
    LOGI("jbyteArray2Byte begin"); 
    if (data == NULL) 
    { 
     LOGI("data is NULL"); 
     return 0; 
    } 

jsize size = m_pJNIEnv->GetArrayLength(data); 
LOGI("GetArrayLength begin %d",size); 
//LOGI("GetByteArrayElements begin,data length = %d",env->GetArrayLength(data)); 
jbyte * olddata = (jbyte*)m_pJNIEnv->GetByteArrayElements(data, 0); 
jsize oldsize = m_pJNIEnv->GetArrayLength(data); 
unsigned char* bytearr = (unsigned char*)olddata; 
*outLen = (int)oldsize; 

return bytearr; 

}

,但我得到JNI警告:JNI方法調用例外LCOM未決 /UAI/JNI/...; (j [BJI)(GetArrayLength) 掛起的例外是:

也是我得到的異常

I/dalvikvm(5836): java.io.IOException: Transceive failed 
11-23 10:19:35.269: I/dalvikvm(5836): at android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:52) 
11-23 10:19:35.269: I/dalvikvm(5836): at android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151) 
11-23 10:19:35.269: I/dalvikvm(5836): at android.nfc.tech.IsoDep.transceive(IsoDep.java:172) 
11-23 10:19:35.269: I/dalvikvm(5836): at com.uai.jni.libUai.uaiGenKeyPair(Native Method) 
11-23 10:19:35.269: I/dalvikvm(5836): at 

回答

1
  1. com.uai.jni.libUai.uaiGenKeyPair是一種本地方法,其中java.io.IOException: Transceive failed發生。
  2. 例外發生在本地代碼(通過JNI調用的方法,而不是本機的功能!)不會自動處理相同的方式,在JVM(冒泡到最近的try/catch)。您必須觀察方法結果和/或通過測試方法ExceptionOccurred()手動檢查。看起來你沒有在uaiGenKeyPair之後做任何事情,只是繼續執行JNI。
  3. 執行已達到呈現代碼m_pJNIEnv->GetArrayLength(data)和JNI機反對,因爲只有非常有限的JNI方法,其可根據現行異常執行。

您必須將異常從JNI層中清除和/或重新拋出回Java。我發現從生梁的優秀JNI在線預訂這裏的例外的一章(不能讓它點擊,所以對象的數字IP):

http://192.9.162.55/docs/books/jni/html/exceptions.html 
+0

我改變了我的代碼,並獲得收發失敗uaiGenKeyPair操作。我認爲uaiGenKeyPair需要很多時間,但是在我設置了isoDEP.timeout(5000)之後,它仍然收發失敗 –

+0

所以你看,這是'android.nfc.tech.IsoDep.transceive'的問題,這是你的異常。不要在輔助函數中使用'GetArrayLength'。用正確的描述發佈一個新問題,以便其他人可以幫助你。理想地接受你已有的一些答案,以便有人真的有興趣回答你下一個問題。 –