0

私はグーグルネクサスの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警告が表示されます:Lcom / uai / jni / ...;(J [BJI)(GetArrayLength)保留中の例外で保留中の例外で呼び出されたJNIメソッドは次のとおりです。

また、私は例外を取得します

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 に再スローする必要があります。ここで、Sheng Liang の優れた JNI ブックの例外に関する章をオンラインで見つけました (クリック可能にすることはできません。SO オブジェクトは数値 IP です)。

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