我遇到了一个非常奇怪的错误,我认为这可能是一个环境问题,但我想知道这里是否有其他人遇到过类似的问题。
首先,到目前为止,一切都运作良好。
我有一个与jni界面兼容的项目。
以下是来自java代码的电话:
myJniWrapper.load(CallbackActivity.this); // this code is inside a Runnable
这是加载方法:
public void load(Activity activityCalledFrom) {
if (mLoaded == false) {
loadNative(mNativeHandle, activityCalledFrom); // This is being called correctly.
}
}
private native void loadNative(long nativeHandle, Object activityCalledFrom);
这是c++:
JNIEXPORT void JNICALL Java_com_datalogics_dlreader_jni_RMBook_loadNative
(JNIEnv *env, jobject obj, jlong handle, jobject activityCalledFrom)
{
if (handle)
{
jmethodID meth = NULL;
// Convert the long back into a pointer
RMBookNative *theBook = (RMBookNative *) handle;
// Ensure the pointer is valid
if (theBook != NULL)
{
// Get the activity that we were called from
theBook->libraryActivityObj = env->NewGlobalRef(activityCalledFrom);
// Call loadDocument to set the URL for the dpdoc::Document
theBook->loadDocument();
}
}
}
稍后,加载完成后,将在C ++代码中调用以下代码:
if (libraryActivityObj != NULL)
{
// Find the loadingFinished method on the library class
meth = jenv->GetMethodID(libraryActivityCls, "loadingFinished", "()V");
// Call the method on the activity
jenv->CallVoidMethod(libraryActivityObj, meth);
}
然后,回到同一个活动中,我有以下方法:
public void loadingFinished()
{
Log.i(getClass().getSimpleName(), "loading finished");
doStuff();
}
奇怪的是,一切正常(至少根据日志) - 当c++尝试调用loadingFinished()方法时,它会调用我活动中的一些随机公共方法发送 - 或者确切地说,它每次都会调用相同的随机方法,但如果我在活动中添加另一个方法,则标签[:C ++]代码将调用另一种方法。它似乎会根据活动中的方法总数随机选择一种方法来调用。
我试过了:清洁&重建,重新启动eclipse,重新启动我的Mac,重新启动设备 - 没有任何帮助。
我不明白发生了什么,并希望有人有任何见解。
如果您需要我发布更多代码/一般信息,请告诉我。