Ich möchte Java-Code aus nativem Code zurückrufen. Der Java-Code:SIGILL in GetMethodID während "Evaluate Ausdruck" ist in Ordnung
public final class Underlying {
public static native int setOnEventListener(OnEventListener listener);
public interface OnEventListener {
int EVENT_TEST = 1;
int onEvent(int code, String msg);
}
}
Der C++ Code (ich einige Prüfungen unterlassen, um deutlich zu machen):
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 (Signal SIGILL: illegale Befehlsoperand) tritt in GetMethodID
. Aber ich werte den gleichen Satz von Evaluieren Ausdruck in Android Studio und alles ist in Ordnung.
Es muss einige Unterschiede zwischen Realität und Evaluate Expression geben. Ein Unterschied, an den ich denken könnte, ist, dass der aufrufende Thread anders sein könnte. setOnEventListener
wurde ursprünglich im UI-Thread aufgerufen, also habe ich einen neuen Thread dafür erstellt, aber nichts geändert.
Es wäre viel klarer, wenn Sie verwandte crashlog von logcat anhängen. – Sergio