0

我使用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 WARNING: JNI method called with exception pending in Lcom/uai/jni/...;(J[BJI) (GetArrayLength) Pending exception is:

我也得到了例外

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 
4

1 回答 1

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 书中找到了一章关于异常的章节(不能使其可点击,SO 对象数字 IP):

http://192.9.162.55/docs/books/jni/html/exceptions.html
于 2012-11-23T15:44:43.180 回答