|
|
动态库中有2函数,一个是JAVA本地函数,另一个是普通函数,在本地函数中创建一个线程用于显示QT窗口程序,普通函数用于回调JAVA中的方法;
其中普通函数如下:
void callJavaMethod ()
{
printf ("in callJavaMethod %d\t%d\n", g_env, g_obj); //打印的值是在本地函数中取得的,也就是说这2个值是正确的
if (g_env == NULL || g_obj == NULL)
return;
// crash caused by the follow 6 lines
jclass cls = g_env->GetObjectClass (g_obj);
jmethodID mid = g_env->GetMethodID (cls, "callback", "()V");
if (mid == 0) return;
g_env->CallVoidMethod (g_obj, mid); // crash
}
在QT类的一个成员函数中调用这个callJavaMethod()时,虚拟机崩溃,而在本地函数中调用callJavaMethod()时,能够正确回调JAVA方法;
如果把JNIEnv * 的几个成员函数去掉,在QT中也能调用这个函数,打印出 g_env 和 g_obj 的值,那么就是说callJavaMethod()在QT中可以被调用,出问题的地方是 JNIEnv 结构体指针的3个成员函数;
几个注意点:
1-这些函数(包括QT程序)都封装在动态库中
2-动态库由JAVA加载并使用JNI调用其中的本地函数启动QT,显示图形界面
3-QT是动态库本地函数中创建的一个新线程(pthread_create()创建的)
4-QT这个线程可以调用callJavaMethod()
5-callJavaMethod()在被本地函数调用时没有任何问题,可以正确执行
5-callJavaMethod()被QT类的成员函数调用时,在 g_env->GetObjectClass (g_obj);的地方出问题,JVM崩溃 |
|