呼叫c>;跨不同线程的java
我试图从c>java调用,打开一个URL(即启动web浏览器)。我有java代码来启动url(这是我主要活动的一种方法)。当我在同一个线程上进行调用时,它正在工作,但是,因为我从另一个线程进行了调用,所以它已断开 我得到以下错误: 这是我的c代码: 我在主UI线程上从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
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);