Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
呼叫c>;跨不同线程的java_Java_Android_Android Ndk_Java Native Interface - Fatal编程技术网

呼叫c>;跨不同线程的java

呼叫c>;跨不同线程的java,java,android,android-ndk,java-native-interface,Java,Android,Android Ndk,Java Native Interface,我试图从c>java调用,打开一个URL(即启动web浏览器)。我有java代码来启动url(这是我主要活动的一种方法)。当我在同一个线程上进行调用时,它正在工作,但是,因为我从另一个线程进行了调用,所以它已断开 我得到以下错误: 这是我的c代码: 我在主UI线程上从c>java调用它,因为创建了主活动: JNIEnv* g_envApp = 0; jobject g_objApp = 0; jclass g_clas

我试图从c>java调用,打开一个URL(即启动web浏览器)。我有java代码来启动url(这是我主要活动的一种方法)。当我在同一个线程上进行调用时,它正在工作,但是,因为我从另一个线程进行了调用,所以它已断开

我得到以下错误:

这是我的c代码:

我在主UI线程上从c>java调用它,因为创建了主活动:

JNIEnv*     g_envApp            =   0;
jobject     g_objApp            =   0;
jclass      g_classApp          =   0;
jmethodID   g_methodOpenURL     =   0;

JNIEXPORT void JNICALL Java_com_mrqwak_app_AppActivity_onCreateN(JNIEnv *env, jobject obj)
{
    g_envApp = env;
    g_objApp = obj;
    g_classApp = env->GetObjectClass(obj);
    if (g_classApp)
    {
        g_methodOpenURL = env->GetMethodID(g_classApp,"openURL","(Ljava/lang/String;)V");
    }
}
稍后,当用户按下按钮打开url时,我从c>java(而不是在主UI上)调用它:

extern  JNIEnv*     g_envApp;
extern  jobject     g_objApp;
extern  jclass      g_classApp;
extern  jmethodID   g_methodOpenURL;

void cHTTP::OpenURL(const char* psURL)
{
    if (g_methodOpenURL)
    {
        jstring jstr = g_envApp->NewStringUTF(psURL);
        g_envApp->CallVoidMethod(g_objApp,g_methodOpenURL,jstr);
    }
}

谢谢,

我认为您需要连接到UI线程-作业对象不能跨线程共享-类似于此:

JNIEnv *env;
jvm->AttachCurrentThread(&env, 0);
jmethodID mid = env->GetMethodID(g_classApp, "openURL", "(Ljava/lang/string)V");
env->CallVoidMethod(g_objApp, mid, url);
在您对JNI的第一次调用中,您在其中设置了其他变量,添加了一个jvm对象:

JavaVM  *jvm;
...
env->GetJavaVM(&jvm);

在Wikipedia上:JNI接口指针(JNIEnv*)作为映射到Java方法的每个本机函数的参数传递,允许与本机方法内的JNI环境交互。此JNI接口指针可以存储,但仅在当前线程中保持有效。其他线程必须首先调用AttachCurrentThread()将自己连接到VM并获取JNI接口指针。。。所以我认为我需要在C中附加CurrentThread?谢谢你JRaymond。只需要解决如何获得“jvm”?刚刚看到:-我需要在c中创建JNI_OnLoad吗?它是自动调用的吗?@cosmic4z补充了一点关于JVM@cosmic4z我没有,但是我使用C++,并用<代码> jn导出> /COD>调用访问我的库。但无论如何,当.so从JavaOK加载时,它会自动调用JNI_Onload,再次感谢。我得到了JVM,从JNI_OnLoad,它现在启动并似乎打开了正确的URL(它在浏览器的地址栏中),但是,仍然没有加载页面。获取以下错误:09-10 18:22:54.840:W/dalvikvm(3968):JNI警告:threadid=11使用env from threadid=1 09-10 18:22:54.840:E/dalvikvm(3968):JNI错误:env->self!=螺纹自身(0x12988与0x200fb0);自动校正
JavaVM  *jvm;
...
env->GetJavaVM(&jvm);