JNI错误访问过时的弱全局引用

时间:2015-08-26 10:53:20

标签: java android java-native-interface

我试图从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);

请建议我解决方案

1 个答案:

答案 0 :(得分:0)

此方法签名至少需要一个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);