SIGSEGV 使用 ARCore 和原生 android 应用程序

SIGSEGV using ARCore with native android application

本文关键字:android 应用程序 原生 使用 ARCore SIGSEGV      更新时间:2023-10-16

我想在原生的c ++ android应用程序中使用ARCore。因此,我需要 JNI 环境和上下文。JNI env 在 android_app 结构中提供,但没有给出上下文。我找到了使用 VM 获取 android 上下文的解决方案。但是没有指向上下文的有效指针。

JNIEnv *env = 0; // env: 0x0000007ed9bdb0c8
jobject contextObj = 0; // env: 0x0000000000000011
_pAndroidApp->activity->vm->AttachCurrentThread(&env, NULL);
jclass activityClass = env->FindClass("android/app/NativeActivity");  // activityClass: 0x0000000000000001
// or use: jclass activityClass = env->GetObjectClass(_pAndroidApp->activity->clazz);
jmethodID contextMethod = env->GetMethodID(activityClass, "getApplicationContext", "()Landroid/content/Context;"); // contextMethod: 0x000000709660f0
contextObj = env->CallObjectMethod(_pAndroidApp->activity->clazz, contextMethod);

在此之后,我想创建一个 ARCore 会话:

ArSession_create(_pAndroidApp->activity->env, contextObj, &ar_session_);

指向contextObj的指针似乎错误。事实上,activityClass似乎也是错误的。创建会话的结果是一个 SIGINT(信号 SIGINT(。

活动的 java 实例可以用作上下文。 我创建了会话调用:

ANativeActivity *activity = app->activity;
CHECK(ArSession_create(activity->env, activity->clazz, &ar_session_) == AR_SUCCESS);
CHECK(ar_session_);
ArConfig* ar_config = nullptr;
ArConfig_create(ar_session_, &ar_config);
CHECK(ar_config);
const ArStatus status = ArSession_checkSupported(ar_session_, ar_config);
CHECK(status == AR_SUCCESS);
CHECK(ArSession_configure(ar_session_, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);
ArFrame_create(ar_session_, &ar_frame_);
CHECK(ar_frame_);

请记住,会话创建可能会导致一些 Java 异常,例如手机不受支持或未安装配套应用程序。 这将导致来自 ArSession_create(( 的返回代码不是AR_SUCCESS,而是类似于 AR_UNAVAILABLE_ARCORE_NOT_INSTALLED。 在这种情况下,断言可能不是最好的做法,而是向用户显示消息。