2016-08-13 21 views
0

我想從本機代碼回調Java代碼。 的Java代碼:「評估表達式」中的SIGILL在GetMethodID中可以

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++代碼(I省略一些檢查以明確):

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

如果您從logcat附加相關的crashlog會更清楚。 – Sergio

回答

0

我發現兩件事導致這個錯誤。

  1. 返回類型爲jint,則必須返回jint
  2. 在Android Studio中,製作項目有時不會重建APK的C++代碼,在這種情況下需要重建項目