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应用程序
- 从该本地代码创建并运行本地线程
- 线程继续运行时立即返回
- 线程完成后,从本机代码调用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();