我想从本机代码中回调Java代码。 Java代码:
public final class Underlying {
public static native int setOnEventListener(OnEventListener listener);
public interface OnEventListener {
int EVENT_TEST = 1;
int onEvent(int code, String msg);
}
}
C ++代码(我省略了一些检查以明确说明):
extern "C" JNIEXPORT jint JNICALL
Java_packageName_Underlying_setOnEventListener(JNIEnv* env, jclass type, jobject listener) {
jclass clz = env->GetObjectClass(listener);
// assign to static jobject
eventListener = env->NewGlobalRef(listener);
// assign to static jmethodID
onEventMethodID = env->GetMethodID(clz, "onEvent", "(ILjava/lang/String;)I");
}
SIGILL (信号SIGILL:非法指令操作数)发生在GetMethodID
中。但我在Android Studio中通过评估表达式来评估相同的句子,一切正常。
现实与评估表达之间必然存在一些差异。我能想到的一个区别是调用线程可能不同。 setOnEventListener
最初是在UI线程中调用的,所以我创建了一个新线程来执行此操作,但没有任何更改。
答案 0 :(得分:0)
我发现有两件事导致了这个错误。
jint
,然后必须返回jint
。