【问题标题】:JNI Error accessed stale weak global referenceJNI 错误访问了陈旧的弱全局引用
【发布时间】:2015-08-31 20:27:35
【问题描述】:

我正在尝试从 JNI 层调用 NfcAdapter.setNdefPushMessageCallback。 您必须知道相同的签名是 setNdefPushMessageCallback(NfcAdapter.CreateNdefMessageCallback callback, Activity activity, Activity... activities)

我已经参考了这个问题one hereanother one

我已经处理了所有这些建议。我怀疑它一定与第二个有关。

这是我的代码:

    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);

请给我建议解决方案

【问题讨论】:

  • 尝试对预期的可变参数使用NULL 引用。
  • 我已经尝试过了。我收到以下错误08-28 09:19:46.161: E/AndroidRuntime(22601): Process: org.iotivity.ca.sample_service, PID: 22601 08-28 09:19:46.161: E/AndroidRuntime(22601): java.lang.NullPointerException: Attempt to get length of null array 08-28 09:19:46.161: E/AndroidRuntime(22601): at android.nfc.NfcAdapter.setNdefPushMessageCallback(NfcAdapter.java:1279)

标签: java android java-native-interface


【解决方案1】:

此方法签名需要至少一个 Activity 作为参数。
如果您没有为最后一个 activities 参数提供任何内容,Java 将自动创建一个新的空数组。
不幸的是,JNI 层不会自动执行此操作,如果接收到空参数 (the foreach loop here),相应的代码将崩溃。

因此,需要向方法调用传递一个空数组:

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);

【讨论】:

  • 非常感谢侯爵。最后,这解决了问题,似乎是最好的方法。我仍然有一个问题,JNI 是否允许长度为 0 的 NewObjectArray?我对您给出的实现有一个小的更正:jobjectArray tempArr = (jobjectArray) (*env)->NewObjectArray(env, 0, (*env)->FindClass(env, "android/app/Activity"), NULL);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2012-01-23
相关资源
最近更新 更多