我创建了一个用于调用本机函数的线程,它调用在C中开发的MPEG2编解码器。而callback_handler调用java函数来提供图像帧,处理程序在图像视图中显示帧。它工作正常。但是当我试图创建两个线程来为每个线程调用本机函数并显示两个视频时。我为每个线程创建了两个处理程序。但是当我启动应用程序时,它调用本机方法两次,但在执行一些函数后,我得到 VM Aborting 错误。我找了那个问题。我发现一个JNIEnv只能有一个线程。为此,我们应该用JavaVM注册线程JNIEnv。在callback_handler中我通过使用此函数
来做到这一点JNIEnv *env = RegisterWithVM(&jvm);
if((NULL == env) || (NULL == jvm))
{
__android_log_print(ANDROID_LOG_INFO,"JNI", "callback_handler call failed\n");
return;
}
我还尝试使用该代码在JNi本机函数中使用JavaVM附加当前线程环境。
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
任何人都可以帮我解决这个问题......
先谢谢
答案 0 :(得分:0)
您似乎覆盖了您的env变量,然后在不同的线程中再次使用它。