GetMethodID中的SIGILL,而“Evaluate Expression”是正常的

时间:2016-08-13 09:13:16

标签: android android-ndk java-native-interface

我想从本机代码中回调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线程中调用的,所以我创建了一个新线程来执行此操作,但没有任何更改。

1 个答案:

答案 0 :(得分:0)

我发现有两件事导致了这个错误。

  1. 返回类型为jint,然后必须返回jint
  2. 在Android Studio中,制作项目有时不会将C ++代码重建为APK,在这种情况下需要重建项目