2016-08-13 1 views
0

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.

+0

Es wäre viel klarer, wenn Sie verwandte crashlog von logcat anhängen. – Sergio

Antwort

0

Ich fand zwei Dinge zu diesem Fehler führen.

  1. Der Rückgabetyp ist jint, dann ein jint muss zurückgegeben werden.
  2. In Android Studio, Machen Sie Projekt manchmal nicht wieder den C++ - Code zu APK, Rebuild Projekt wird in dieser Situation benötigt.
Verwandte Themen