启动Intent,onActivityResult,AsyncTask在JNI的Java调用之后不起作用

时间:2018-03-07 12:54:29

标签: java android java-native-interface

在我通过JNI从C调用Java方法后,我遇到了一些很大的问题。 我无法从被调用的java方法启动startActivityResult,AsyncTask,Intent等。例如,事件onActivityResult未被触发。有谁知道导致这个问题的原因是什么?

这是我称之为Java的方法:

public void requestMediaProjection() 
{        
    try {         


        startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(),
          REQUEST_CODE_REQUEST_MEDIA_PROJECTION_RESULT);

    } catch (NoClassDefFoundError e) 
    {
      String err = e.toString();
    } catch (Throwable t) 
    {
        String err = t.toString();
    }        
}
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
        if (requestCode == REQUEST_CODE_REQUEST_MEDIA_PROJECTION_RESULT) {
            onRequestMediaProjectionResult(resultCode, data);
        }
    }

这是C中用于调用Java的代码的一部分:

int main(int argc, char **argv)
{
if(g_Env != NULL)
{
    cls = (*g_Env)->FindClass(g_Env, "org/onaips/vnc/MainActivity");
    if (cls == NULL) {
        LOGD("Failed to find Main class");
    }
    else
    {
        LOGD("we found MainActivity");
    }
}


LOGD("Find Main method");
if(g_Env !=NULL)
{
    mid = (*g_Env)->GetMethodID(g_Env, cls, "requestMediaProjection", "()V");
    //mid = (*g_Env)->GetMethodID(g_Env, cls, "takeScreenshot", "()V");
    if (mid == NULL) {
        LOGD("Failed to find takeScreenshot function");
    }
    else
    {
        LOGD("takeScreenshot function was loaded");
    }
}

if ((*jvm)->AttachCurrentThread(jvm,&g_env, NULL) != 0)
{
    LOGD("fail attach process");
}

if(g_Env !=NULL && mid != NULL)
{
    LOGD("Call takeScreenshot");
    (*g_Env)->CallVoidMethod(g_Env, g_Obj, mid);
}
}

这是我的JNI初始化函数,我在MainActivity中按钮的on_click处理程序中调用:

jint Java_org_onaips_vnc_MainActivity_runMain(JNIEnv* env, jobject thiz,jobjectArray jargv)
{    //jargv is a Java array of Java strings
    int argc = (*env)-> GetArrayLength(env,jargv);
    char *argv[argc];
    int i;
    LOGD("runMainEnter");
    for(i=0; i<argc; i++)
    {
        jstring js = (*env)->GetObjectArrayElement(env,jargv, i); //A Java string
        const char *pjc = (*env)->GetStringUTFChars(env,js,0); //A pointer to a Java-managed char buffer
        unsigned int jslen = strlen(pjc);
        //argv[i] = (char*)realloc(argv[i],jslen + 1);
        argv[i] = (char*) malloc(jslen + 1);
        strcpy(argv[i], pjc); //Copy to *our* buffer. We could omit that, but IMHO this is cleaner. Also, const correctness.
        (*env)->ReleaseStringUTFChars(env,js, pjc);
    }
    g_Env = env;
    g_Obj = thiz;
    //Call main
    main(argc, argv);

    LOGD("runMainEnd");   
}

0 个答案:

没有答案