Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.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
Java JNI-异步任务崩溃_Java_Android_C++_Multithreading_Java Native Interface - Fatal编程技术网

Java JNI-异步任务崩溃

Java JNI-异步任务崩溃,java,android,c++,multithreading,java-native-interface,Java,Android,C++,Multithreading,Java Native Interface,我正在努力做到以下几点: 在Android上运行Java应用程序 > P>调用java应用程序的原生C++代码< /p> 从该本地代码创建并运行本地线程 线程继续运行时立即返回 线程完成后,从本机代码调用java方法 这是我的密码: #include <jni.h> #include <pthread.h> #include <unistd.h> /* sleep() */ #include <stdio.h> #ifdef __cplu

我正在努力做到以下几点:

  • 在Android上运行Java应用程序

  • > P>调用java应用程序的原生C++代码< /p>
  • 从该本地代码创建并运行本地线程

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

  • 线程完成后,从本机代码调用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" );
}
我在第121行的“Handler”中有一个运行时异常,源文件不可用


编辑:我实际上正在访问Java回调,但当我开始创建对话框时,它会崩溃。

你真的应该在帖子中包含堆栈跟踪。然而,听起来您的问题很简单——除了主线程之外,您无法从任何地方接触UI。最简单的解决方案可能是调用java方法,该方法将UI操作包装在runOnUiThread()中。当然,您还必须拥有所有正确的jni内容,并在VM中注册您的本机线程-但听起来您可能已经解决了这些部分。没错!谢谢你的帮助!您可以使用handle和broadcast来访问UI元素,而不是创建一个包装
runOnUiThread
的方法。
    AlertDialog.Builder dlgAlert  = new AlertDialog.Builder( this );                      
    dlgAlert.setMessage( msgBoxText );
    dlgAlert.setTitle( "" );              
    dlgAlert.setPositiveButton( "OK", null );
    dlgAlert.setCancelable( true );
    dlgAlert.create().show();