我试图从JNI层调用NfcAdapter.setNdefPushMessageCallback。
你必须知道同样的签名
setNdefPushMessageCallback(NfcAdapter.CreateNdefMessageCallback callback, Activity activity, Activity... activities)
我已经对这个问题one here和another 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);
请建议我解决方案
答案 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);