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

Java 访问过时的弱全局引用时发生JNI错误,java,android,java-native-interface,Java,Android,Java Native Interface,我试图从JNI层调用NfcAdapter.setNdefPushMessageCallback。 正如您必须知道的,相同的签名是 setNdefPushMessageCallback(NfcAdapter.CreateNdefMessageCallback回调,活动活动,活动…活动) 我已经查阅了一些关于这个问题的参考资料,并且 我已经考虑了所有这些建议。我猜一定和第二个有关 这是我的密码: jmethodID methodId = (*env)->GetMethodID(

我试图从JNI层调用NfcAdapter.setNdefPushMessageCallback。 正如您必须知道的,相同的签名是
setNdefPushMessageCallback(NfcAdapter.CreateNdefMessageCallback回调,活动活动,活动…活动)

我已经查阅了一些关于这个问题的参考资料,并且

我已经考虑了所有这些建议。我猜一定和第二个有关

这是我的密码:

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

请向我推荐解决方案

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

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

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

尝试对预期的vararg使用
NULL
引用。我已经尝试过了。我得到以下错误
08-28 09:19:46.161:E/AndroidRuntime(22601):Process:org.iotivity.ca.sample_服务,PID:22601 08-28 09:19:46.161:E/AndroidRuntime(22601):java.lang.NullPointerException:尝试获取null数组的长度08-28 09:19:46.161:E/AndroidRuntime(22601):位于android.nfc.NfcAdapter.setNdefPushMessageCallback(NfcAdapter.java:1279)
非常感谢Marquis。最后,这解决了问题,似乎是最好的方法。我仍然有一个问题,JNI是否允许长度为0的
NewObjectArray
?我对您给出的实现进行了一个小的更正:
jobjectArray tempArr=(jobjectArray)(*env)->NewObjectArray(env,0,(*env)->FindClass(env,“android/app/Activity”),NULL);