簡體   English   中英

JNI錯誤訪問過時的弱全局引用

[英]JNI Error accessed stale weak global reference

我正在嘗試從JNI層調用NfcAdapter.setNdefPushMessageCallback。 您必須知道,相同的簽名是setNdefPushMessageCallback(NfcAdapter.CreateNdefMessageCallback callback, Activity activity, Activity... activities)

我已經在這里另一篇文章中對這個問題進行了一些參考

我已經考慮了所有這些建議。 我懷疑它一定與第二個有關。

這是我的代碼:

    jmethodID methodId = (*env)->GetMethodID(
    env, cls, "setNdefPushMessageCallback",
    "(Landroid/nfc/NfcAdapter$CreateNdefMessageCallback;Landroid/app/Activity;[Landroid/app/Activity;)V");

(*env)->CallVoidMethod(env, g_adapter, methodId, g_nfcCallback, g_activity);

代替[Landroid / app / Activity; (va_list),我沒有提出任何其他論點。

如果是Java,則完全可以接受:

NfcAdapter.setNdefPushMessageCallback(callback, activity);

請給我建議解決方案

此方法簽名至少需要一個Activity作為參數。
如果您沒有為最后一個activities參數提供任何信息,Java將自動創建一個新的空數組。
不幸的是,JNI層不會自動執行該操作,並且如果接收到空參數( 此處為foreach循環 ),則相應的代碼將崩潰。

因此,您需要將一個空數組傳遞給方法調用:

jobjectArray empty = (jobjectArray) (*env)->NewObjectArray(env, 0, (*env)->FindClass(env, "Landroid/app/Activity;"), NULL);
(*env)->CallVoidMethod(env, g_adapter, methodId, g_nfcCallback, g_activity, empty);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM