繁体   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