more android camera work. no longer crashes, but still no image

This commit is contained in:
ToadKing 2013-11-19 14:20:29 -05:00
parent 82104bc7e2
commit 894b2870c0
3 changed files with 44 additions and 43 deletions

View File

@ -43,7 +43,7 @@ public final class RetroActivity extends NativeActivity
public boolean onCameraPoll() public boolean onCameraPoll()
{ {
boolean ret; boolean ret;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) if (texture != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
{ {
long newTimestamp = texture.getTimestamp(); long newTimestamp = texture.getTimestamp();
if (newTimestamp != lastTimestamp) if (newTimestamp != lastTimestamp)

View File

@ -29,6 +29,13 @@ typedef struct android_camera
{ {
JNIEnv *env; JNIEnv *env;
JavaVM *java_vm; JavaVM *java_vm;
jclass class;
jmethodID onCameraInit;
jmethodID onCameraFree;
jmethodID onCameraPoll;
jmethodID onCameraStart;
jmethodID onCameraStop;
jmethodID onCameraSetTexture;
GLuint tex; GLuint tex;
} androidcamera_t; } androidcamera_t;
@ -50,14 +57,38 @@ static void *android_camera_init(const char *device, uint64_t caps, unsigned wid
return NULL; return NULL;
androidcamera->java_vm = (JavaVM*)android_app->activity->vm; androidcamera->java_vm = (JavaVM*)android_app->activity->vm;
(*androidcamera->java_vm)->AttachCurrentThread(androidcamera->java_vm, &androidcamera->env, 0); if ((*androidcamera->java_vm)->AttachCurrentThread(androidcamera->java_vm, &androidcamera->env, 0) != JNI_OK)
jmethodID onCameraInit = NULL;
GET_METHOD_ID(androidcamera->env, onCameraInit, globalMyNativeActivityClass, "onCameraInit", "()V");
if (!onCameraInit)
return NULL; return NULL;
CALL_VOID_METHOD(androidcamera->env, globalMyNativeActivityClass, onCameraInit); GET_OBJECT_CLASS(androidcamera->env, androidcamera->class, android_app->activity->clazz);
if (androidcamera->class == NULL)
return NULL;
GET_METHOD_ID(androidcamera->env, androidcamera->onCameraInit, androidcamera->class, "onCameraInit", "()V");
if (!androidcamera->onCameraInit)
return NULL;
GET_METHOD_ID(androidcamera->env, androidcamera->onCameraFree, androidcamera->class, "onCameraFree", "()V");
if (!androidcamera->onCameraFree)
return NULL;
GET_METHOD_ID(androidcamera->env, androidcamera->onCameraSetTexture, androidcamera->class, "onCameraSetTexture", "(I)V");
if (!androidcamera->onCameraSetTexture)
return NULL;
GET_METHOD_ID(androidcamera->env, androidcamera->onCameraStart, androidcamera->class, "onCameraStart", "()V");
if (!androidcamera->onCameraStart)
return NULL;
GET_METHOD_ID(androidcamera->env, androidcamera->onCameraStop, androidcamera->class, "onCameraStop", "()V");
if (!androidcamera->onCameraStop)
return NULL;
GET_METHOD_ID(androidcamera->env, androidcamera->onCameraPoll, androidcamera->class, "onCameraPoll", "()Z");
if (!androidcamera->onCameraPoll)
return NULL;
CALL_VOID_METHOD(androidcamera->env, android_app->activity->clazz, androidcamera->onCameraInit);
return androidcamera; return androidcamera;
} }
@ -68,14 +99,8 @@ static void android_camera_free(void *data)
androidcamera_t *androidcamera = (androidcamera_t*)data; androidcamera_t *androidcamera = (androidcamera_t*)data;
(void)android_app; (void)android_app;
jmethodID onCameraFree = NULL; CALL_VOID_METHOD(androidcamera->env, android_app->activity->clazz, androidcamera->onCameraFree);
GET_METHOD_ID(androidcamera->env, onCameraFree, globalMyNativeActivityClass, "onCameraFree", "()V");
if (!onCameraFree)
goto end;
CALL_VOID_METHOD(androidcamera->env, globalMyNativeActivityClass, onCameraFree);
end:
(*androidcamera->java_vm)->DetachCurrentThread(androidcamera->java_vm); (*androidcamera->java_vm)->DetachCurrentThread(androidcamera->java_vm);
free(androidcamera); free(androidcamera);
@ -91,24 +116,11 @@ static bool android_camera_start(void *data)
glGenTextures(1, &androidcamera->tex); glGenTextures(1, &androidcamera->tex);
jmethodID onCameraSetTexture = NULL; CALL_VOID_METHOD_PARAM(androidcamera->env, android_app->activity->clazz, androidcamera->onCameraSetTexture, (int) androidcamera->tex);
GET_METHOD_ID(androidcamera->env, onCameraSetTexture, globalMyNativeActivityClass, "onCameraSetTexture", "(I)V");
if (!onCameraSetTexture)
goto end;
CALL_VOID_METHOD_PARAM(androidcamera->env, globalMyNativeActivityClass, onCameraSetTexture, (int) androidcamera->tex); CALL_VOID_METHOD(androidcamera->env, android_app->activity->clazz, androidcamera->onCameraStart);
jmethodID onCameraStart = NULL;
GET_METHOD_ID(androidcamera->env, onCameraSetTexture, globalMyNativeActivityClass, "onCameraStart", "()V");
if (!onCameraStart)
goto end;
CALL_VOID_METHOD(androidcamera->env, globalMyNativeActivityClass, onCameraStart);
return true; return true;
end:
return false;
} }
static void android_camera_stop(void *data) static void android_camera_stop(void *data)
@ -118,12 +130,7 @@ static void android_camera_stop(void *data)
(void)android_app; (void)android_app;
(void)androidcamera; (void)androidcamera;
jmethodID onCameraStop = NULL; CALL_VOID_METHOD(androidcamera->env, android_app->activity->clazz, androidcamera->onCameraStop);
GET_METHOD_ID(androidcamera->env, onCameraStop, globalMyNativeActivityClass, "onCameraStop", "()V");
if (!onCameraStop)
return;
CALL_VOID_METHOD(androidcamera->env, globalMyNativeActivityClass, onCameraStop);
if (androidcamera->tex) if (androidcamera->tex)
glDeleteTextures(1, &androidcamera->tex); glDeleteTextures(1, &androidcamera->tex);
@ -138,13 +145,8 @@ static bool android_camera_poll(void *data, retro_camera_frame_raw_framebuffer_t
(void)androidcamera; (void)androidcamera;
(void)frame_raw_cb; (void)frame_raw_cb;
jmethodID onCameraPoll = NULL;
GET_METHOD_ID(androidcamera->env, onCameraPoll, globalMyNativeActivityClass, "onCameraPoll", "()Z");
if (!onCameraPoll)
goto end;
jboolean newFrame; jboolean newFrame;
CALL_BOOLEAN_METHOD(androidcamera->env, newFrame, globalMyNativeActivityClass, onCameraPoll); CALL_BOOLEAN_METHOD(androidcamera->env, newFrame, android_app->activity->clazz, androidcamera->onCameraPoll);
if (newFrame) if (newFrame)
{ {
@ -162,7 +164,6 @@ static bool android_camera_poll(void *data, retro_camera_frame_raw_framebuffer_t
return true; return true;
} }
end:
return false; return false;
} }

View File

@ -383,7 +383,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved)
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_6) != JNI_OK) if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)
return -1; return -1;
globalMyNativeActivityClass = (*env)->NewGlobalRef(env, (*env)->FindClass(env, "com/retroarch/browser/RetroActivity")); //globalMyNativeActivityClass = (*env)->NewGlobalRef(env, (*env)->FindClass(env, "com/retroarch/browser/RetroActivity"));
return JNI_VERSION_1_6; return JNI_VERSION_1_6;
} }