调用异常挂起getarraylength的jni方法

时间:2012-11-23 02:39:20

标签: android java-native-interface nfc

我使用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 

1 个答案:

答案 0 :(得分: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方法可以在挂起的异常时执行。
  4. 您必须将JNI层中的异常清除和/或重新抛出回Java。我在网上找到了一篇关于盛亮优秀JNI书籍例外的章节(无法点击,SO对象数字IP):

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