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線程中調用的,所以我創建了一個新線程來完成此操作,但沒有任何更改。
如果您從logcat附加相關的crashlog會更清楚。 – Sergio