Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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
在android应用程序中创建两个线程时VM中止_Android_Java Native Interface - Fatal编程技术网

在android应用程序中创建两个线程时VM中止

在android应用程序中创建两个线程时VM中止,android,java-native-interface,Android,Java Native Interface,我创建了一个线程来调用本机函数,它调用的是用C语言开发的MPEG2编解码器。回调处理器调用的是java函数,用于给出图像帧,处理器在图像视图上显示帧。它工作得很好。但当我试图创建两个线程来为每个线程调用本机函数并显示两个视频时,我为每个线程创建了两个处理程序。但是当我启动应用程序时,它调用了两次本机方法,但是在执行了一些函数之后,我得到了VM中止错误。我一直在寻找那个问题。我发现一个JNIEnv只能有一个线程。为此,我们应该向JavaVM注册线程JNIEnv。在callback\u处理程序中,我

我创建了一个线程来调用本机函数,它调用的是用C语言开发的MPEG2编解码器。回调处理器调用的是java函数,用于给出图像帧,处理器在图像视图上显示帧。它工作得很好。但当我试图创建两个线程来为每个线程调用本机函数并显示两个视频时,我为每个线程创建了两个处理程序。但是当我启动应用程序时,它调用了两次本机方法,但是在执行了一些函数之后,我得到了VM中止错误。我一直在寻找那个问题。我发现一个JNIEnv只能有一个线程。为此,我们应该向JavaVM注册线程JNIEnv。在callback\u处理程序中,我使用这个函数来实现这一点

JNIEnv *env = RegisterWithVM(&jvm);
    if((NULL == env) || (NULL == jvm))
    {
        __android_log_print(ANDROID_LOG_INFO,"JNI", "callback_handler call failed\n");
        return;
    }
我还尝试使用该代码在JNi本机函数中使用JavaVM访问currentThread环境

gJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6);
gJavaVM->AttachCurrentThread(&env, NULL);
但是在使用这个之后,我得到了这个错误

11-28 16:40:23.430: I/JNI(323): Loaded
11-28 16:40:23.430: I/JNI(323): Find the class
11-28 16:40:23.430: I/JNI(323): Registered...
11-28 16:40:23.430: I/JNI(323): Version...65540
11-28 16:40:23.440: I/JNI(323): CallDecoding function of thread is called
11-28 16:40:23.451: I/JNI(323): StartDecoding function is called
11-28 16:40:23.451: W/dalvikvm(323): JNI WARNING: threadid=7 using env from threadid=8
11-28 16:40:23.451: W/dalvikvm(323):              in Lcom/example/Internet_TV12;.CallDecoding1 (ILjava/lang/Object;)V (NewByteArray)
11-28 16:40:23.451: I/dalvikvm(323): "Thread-8" prio=5 tid=7 NATIVE
11-28 16:40:23.451: I/dalvikvm(323):   | group="main" sCount=0 dsCount=0 s=N obj=0x44ee97f0 self=0x131cc0
11-28 16:40:23.470: I/JNI(323): CallDecoding function of thread is called
11-28 16:40:23.470: I/JNI(323): In JNI interface image file opened 
11-28 16:40:23.470: I/JNI(323): StartDecoding function is called

11-28 16:40:23.499: I/dalvikvm(323):   | sysTid=331 nice=0 sched=0/0 cgrp=default handle=1153704
11-28 16:40:23.499: I/dalvikvm(323):   | schedstat=( 28746111 138980250 15 )
11-28 16:40:23.499: I/dalvikvm(323):   at com.example.Internet_TV12.CallDecoding1(Native Method)
11-28 16:40:23.499: I/dalvikvm(323):   at com.example.Internet_TV12$4.run(Internet_TV12.java:57)
11-28 16:40:23.499: I/dalvikvm(323):   at java.lang.Thread.run(Thread.java:1096)
11-28 16:40:23.499: E/dalvikvm(323): VM aborting
请任何人帮我解决这个问题


提前感谢

您似乎覆盖了您的env变量,然后在不同的线程中再次使用它。

首先,我想感谢您的回复。你能告诉我我该怎么做吗。我是否需要为第二个线程创建另一个本机调用解码函数(JNI本机方法)。我也试过了。但是得到了相同的错误。你应该在适当的线程上下文中连接你的env变量,例如在线程开始调用AttachCurrentThread之后。获取的环境的值只能在当前线程上下文中使用。不确定这是否是您的问题的原因,但请尝试。谢谢您的回复。我对你的回答有些怀疑。首先,我想问我应该在本机调用还是在回调处理程序中调用AttachCurrentThread?我的原生方法是调用其他C函数并将数据提供给回调函数处理程序。你能粘贴一些代码来发展你想说的概念吗。