diff --git a/android/phoenix/src/com/retroarch/browser/RetroActivity.java b/android/phoenix/src/com/retroarch/browser/RetroActivity.java index b467acee6b..6dc6afc8b7 100644 --- a/android/phoenix/src/com/retroarch/browser/RetroActivity.java +++ b/android/phoenix/src/com/retroarch/browser/RetroActivity.java @@ -1,12 +1,15 @@ package com.retroarch.browser; import java.io.IOException; + import com.retroarch.browser.preferences.util.UserPreferences; + import android.annotation.SuppressLint; import android.app.NativeActivity; import android.graphics.SurfaceTexture; import android.hardware.Camera; import android.os.Build; +import android.util.Log; public final class RetroActivity extends NativeActivity { @@ -14,6 +17,15 @@ public final class RetroActivity extends NativeActivity private long lastTimestamp = 0; private SurfaceTexture texture; + static { + System.loadLibrary("retroarch-activity"); + } + + public RetroActivity() { + super(); + Log.i("RetroActivity", "Creating MyNativeActivity"); + } + public void onCameraStart() { mCamera.startPreview(); diff --git a/camera/android.c b/camera/android.c index 1863c41957..42b6536345 100644 --- a/camera/android.c +++ b/camera/android.c @@ -29,7 +29,6 @@ typedef struct android_camera { JNIEnv *env; JavaVM *java_vm; - jclass class; // RetroActivity class GLuint tex; } androidcamera_t; @@ -53,15 +52,12 @@ static void *android_camera_init(const char *device, uint64_t caps, unsigned wid androidcamera->java_vm = (JavaVM*)android_app->activity->vm; (*androidcamera->java_vm)->AttachCurrentThread(androidcamera->java_vm, &androidcamera->env, 0); - GET_OBJECT_CLASS(androidcamera->env, androidcamera->class, android_app->activity->clazz); - - jmethodID onCameraInit = NULL; - GET_METHOD_ID(androidcamera->env, onCameraInit, androidcamera->class, "onCameraInit", "()V"); + GET_METHOD_ID(androidcamera->env, onCameraInit, globalMyNativeActivityClass, "onCameraInit", "()V"); if (!onCameraInit) return NULL; - CALL_VOID_METHOD(androidcamera->env, androidcamera->class, onCameraInit); + CALL_VOID_METHOD(androidcamera->env, globalMyNativeActivityClass, onCameraInit); return androidcamera; } @@ -73,11 +69,11 @@ static void android_camera_free(void *data) (void)android_app; jmethodID onCameraFree = NULL; - GET_METHOD_ID(androidcamera->env, onCameraFree, androidcamera->class, "onCameraFree", "()V"); + GET_METHOD_ID(androidcamera->env, onCameraFree, globalMyNativeActivityClass, "onCameraFree", "()V"); if (!onCameraFree) goto end; - CALL_VOID_METHOD(androidcamera->env, androidcamera->class, onCameraFree); + CALL_VOID_METHOD(androidcamera->env, globalMyNativeActivityClass, onCameraFree); end: (*androidcamera->java_vm)->DetachCurrentThread(androidcamera->java_vm); @@ -96,18 +92,18 @@ static bool android_camera_start(void *data) glGenTextures(1, &androidcamera->tex); jmethodID onCameraSetTexture = NULL; - GET_METHOD_ID(androidcamera->env, onCameraSetTexture, androidcamera->class, "onCameraSetTexture", "(I)V"); + GET_METHOD_ID(androidcamera->env, onCameraSetTexture, globalMyNativeActivityClass, "onCameraSetTexture", "(I)V"); if (!onCameraSetTexture) goto end; - CALL_VOID_METHOD_PARAM(androidcamera->env, androidcamera->class, onCameraSetTexture, (int) androidcamera->tex); + CALL_VOID_METHOD_PARAM(androidcamera->env, globalMyNativeActivityClass, onCameraSetTexture, (int) androidcamera->tex); jmethodID onCameraStart = NULL; - GET_METHOD_ID(androidcamera->env, onCameraSetTexture, androidcamera->class, "onCameraStart", "()V"); + GET_METHOD_ID(androidcamera->env, onCameraSetTexture, globalMyNativeActivityClass, "onCameraStart", "()V"); if (!onCameraStart) goto end; - CALL_VOID_METHOD(androidcamera->env, androidcamera->class, onCameraStart); + CALL_VOID_METHOD(androidcamera->env, globalMyNativeActivityClass, onCameraStart); return true; @@ -123,11 +119,11 @@ static void android_camera_stop(void *data) (void)androidcamera; jmethodID onCameraStop = NULL; - GET_METHOD_ID(androidcamera->env, onCameraStop, androidcamera->class, "onCameraStop", "()V"); + GET_METHOD_ID(androidcamera->env, onCameraStop, globalMyNativeActivityClass, "onCameraStop", "()V"); if (!onCameraStop) return; - CALL_VOID_METHOD(androidcamera->env, androidcamera->class, onCameraStop); + CALL_VOID_METHOD(androidcamera->env, globalMyNativeActivityClass, onCameraStop); if (androidcamera->tex) glDeleteTextures(1, &androidcamera->tex); @@ -143,12 +139,12 @@ static bool android_camera_poll(void *data, retro_camera_frame_raw_framebuffer_t (void)frame_raw_cb; jmethodID onCameraPoll = NULL; - GET_METHOD_ID(androidcamera->env, onCameraPoll, androidcamera->class, "onCameraPoll", "()Z"); + GET_METHOD_ID(androidcamera->env, onCameraPoll, globalMyNativeActivityClass, "onCameraPoll", "()Z"); if (!onCameraPoll) goto end; jboolean newFrame; - CALL_BOOLEAN_METHOD(androidcamera->env, newFrame, androidcamera->class, onCameraPoll); + CALL_BOOLEAN_METHOD(androidcamera->env, newFrame, globalMyNativeActivityClass, onCameraPoll); if (newFrame) { diff --git a/frontend/platform/platform_android.c b/frontend/platform/platform_android.c index 30cc42d88c..94c57f68f5 100644 --- a/frontend/platform/platform_android.c +++ b/frontend/platform/platform_android.c @@ -29,6 +29,7 @@ #include "../../file.h" struct android_app *g_android; +jclass globalMyNativeActivityClass; //forward decls static void system_deinit(void *data); @@ -375,6 +376,18 @@ static void system_shutdown(bool unused) exit(0); } +jint JNI_OnLoad(JavaVM* vm, void* reserved) +{ + RARCH_LOG("JNI_OnLoad.\n"); + JNIEnv* env; + if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_6) != JNI_OK) + return -1; + + globalMyNativeActivityClass = (*env)->NewGlobalRef(env, (*env)->FindClass(env, "com/retroarch/browser/RetroActivity")); + + return JNI_VERSION_1_6; +} + const frontend_ctx_driver_t frontend_ctx_android = { get_environment_settings, /* get_environment_settings */ system_init, /* init */ diff --git a/frontend/platform/platform_android.h b/frontend/platform/platform_android.h index f9d2a12448..3cb0611303 100644 --- a/frontend/platform/platform_android.h +++ b/frontend/platform/platform_android.h @@ -27,6 +27,8 @@ #include "../../thread.h" +extern jclass globalMyNativeActivityClass; + struct android_app { ANativeActivity* activity;