在我通过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");
}