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