2012-11-23 4 views
0

RF 카드를 기반으로 프로그램을 개발하기 위해 Google Nexus의 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 경고를 얻을 : 예외가 Lcom에 보류 호출 JNI 방법을/UAI/JNI/...; (J [BJI) (주는 GetArrayLength) 보류 예외이다

또한 I 예외

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
    0123을 얻을
  1. com.uai.jni.libUai.uaiGenKeyPair은 기본 방법이며 java.io.IOException: Transceive failed이 발생합니다.
  2. 네이티브 코드에서 예외가 발생했습니다 (네이티브 함수가 아닌 JNI 메서드 호출을 통해!). JVM에서와 마찬가지로 자동으로 처리되지 않습니다 (가장 가까운 try/catch까지 버블 링 됨). 방법 결과를 관찰하거나 시험 방법 ExceptionOccurred()을 사용하여 수동으로 점검해야합니다. uaiGenKeyPair 이후에 당신이하지 못했고 JNI 실행으로 계속 진행된 것 같습니다.
  3. 보류중인 예외시 실행할 수있는 매우 제한된 JNI 메소드 세트 만 있기 때문에 실행이 제시된 코드에서 m_pJNIEnv->GetArrayLength(data)에 도달하고 JNI 시스템이 오브젝트 처리 중입니다.

Java에서 JNI 레이어의 예외를 지우거나 다시 발생시켜야합니다. 나는 (SO 숫자로 된 IP 객체, 그것을 클릭 할 수 없습니다) 온라인 여기 셩 리앙의 우수한 JNI 책에서 예외에 장을 발견

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

난 내 코드를 변경하고, 무전기는 uaiGenKeyPair 작업에 실패 얻을. 나는 uaiGenKeyPair가 너무 많은 시간이 걸릴 것이라고 생각하지만 isoDEP.timeout (5000)을 설정 한 후에도 여전히 송수신에 실패했다. –

+0

그래서 'android.nfc.tech.IsoDep.transceive'에 문제가있다. 예외가있다. 당신의 헬퍼 함수에서'GetArrayLength'가 아닙니다. 다른 사람이 당신을 도울 수 있도록 적절한 설명과 함께 새로운 질문을 게시하십시오. 당신이 이미 가지고있는 해답 중 일부를 받아들이면 누군가가 실제로 다음 질문에 답하는 것에 관심이 있습니다. –

관련 문제