JNI - 异步任务崩溃

时间:2015-02-24 16:02:18

标签: java android c++ multithreading java-native-interface

我试图执行以下操作:

  • 在Android上运行Java应用

  • 从该Java应用程序调用本机C ++代码

  • 从该natice代码创建并运行本机线程

  • 在线程继续运行时立即返回

  • 线程完成后,从本机代码调用java方法

这是我的代码:

#include <jni.h>
#include <pthread.h>
#include <unistd.h> /* sleep() */
#include <stdio.h>

#ifdef __cplusplus
extern "C"
{
#endif

JNIEXPORT jstring JNICALL Java_xxx_asynctasktest_MainActivity_runAsyncTask( JNIEnv * env, jobject that, jstring oDummyStr );

#ifdef __cplusplus
}
#endif


JavaVM *  g_jvm;
jobject   g_obj;
jmethodID g_mid;


void * threadProc( void * pArg )
{
    JNIEnv * env = 0;
    int res = g_jvm->AttachCurrentThread( & env, NULL );

    sleep( 3 );

    jobject oStr = (jobject)pArg;
    env->CallObjectMethod( g_obj, g_mid, oStr );

    env->DeleteGlobalRef( oStr );
    env->DeleteGlobalRef( g_obj );

    g_jvm->DetachCurrentThread();

    return 0;
}


JNIEXPORT jstring JNICALL Java_xxx_asynctasktest_MainActivity_runAsyncTask( JNIEnv * env, jobject that, jstring oDummyStr )
{
    env->GetJavaVM( & g_jvm );
    g_obj = env->NewGlobalRef( that );
    g_mid = env->GetMethodID( env->GetObjectClass( that ), "onTaskFinished", "(Ljava/lang/String;)Ljava/lang/String;" );

    if( g_mid == NULL )
    {
        fprintf( stderr, "No such method" );
    }
    else
    {
        pthread_t thread = 0;
        pthread_create( & thread, NULL, threadProc, (void *)env->NewGlobalRef( oDummyStr ) );
    }

    return env->NewStringUTF( "lolol" );
}

我的问题是,当我调用env->CallObjectMethod( g_obj, g_mid, oStr );时,eclipse尝试在类文件编辑器中打开Handler.class,并且说没有找到,并且线程没有调用Java方法。

我做错了什么?谢谢。

编辑:忘记提及我的Java回调创建一个对话框如下:

    AlertDialog.Builder dlgAlert  = new AlertDialog.Builder( this );                      
    dlgAlert.setMessage( msgBoxText );
    dlgAlert.setTitle( "" );              
    dlgAlert.setPositiveButton( "OK", null );
    dlgAlert.setCancelable( true );
    dlgAlert.create().show();

我在&#34; Handler&#34;中有某个运行时异常。在第121行,源文件不可用。

编辑:我实际上已经到达了Java回调,但是当我开始创建对话框时崩溃了。

0 个答案:

没有答案