我使用google nexus s的nfc功能来开发基于RF卡的程序。 这是我的方法,我认为问题是数据对象
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
答案 0 :(得分:1)
com.uai.jni.libUai.uaiGenKeyPair
是一种原生方法,其中java.io.IOException: Transceive failed
发生。ExceptionOccurred()
手动检查。似乎你没有在uaiGenKeyPair
之后做过,只是继续执行JNI。m_pJNIEnv->GetArrayLength(data)
且JNI机器正在反对,因为只有非常有限的一组JNI方法可以在挂起的异常时执行。您必须将JNI层中的异常清除和/或重新抛出回Java。我在网上找到了一篇关于盛亮优秀JNI书籍例外的章节(无法点击,SO对象数字IP):
http://192.9.162.55/docs/books/jni/html/exceptions.html