/* * Copyright 2017 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "hello_ar_application.h" #define JNI_METHOD(return_type, method_name) \ JNIEXPORT return_type JNICALL \ Java_org_skia_arcore_JniInterface_##method_name extern "C" { namespace { // maintain a reference to the JVM so we can use it later. static JavaVM *g_vm = nullptr; inline jlong jptr(hello_ar::HelloArApplication *native_hello_ar_application) { return reinterpret_cast(native_hello_ar_application); } inline hello_ar::HelloArApplication *native(jlong ptr) { return reinterpret_cast(ptr); } } // namespace jint JNI_OnLoad(JavaVM *vm, void *) { g_vm = vm; return JNI_VERSION_1_6; } JNI_METHOD(jlong, createNativeApplication) (JNIEnv *env, jclass, jobject j_asset_manager) { AAssetManager *asset_manager = AAssetManager_fromJava(env, j_asset_manager); return jptr(new hello_ar::HelloArApplication(asset_manager)); } JNI_METHOD(void, destroyNativeApplication) (JNIEnv *, jclass, jlong native_application) { delete native(native_application); } JNI_METHOD(void, onPause) (JNIEnv *, jclass, jlong native_application) { native(native_application)->OnPause(); } JNI_METHOD(void, onResume) (JNIEnv *env, jclass, jlong native_application, jobject context, jobject activity) { native(native_application)->OnResume(env, context, activity); } JNI_METHOD(void, onGlSurfaceCreated) (JNIEnv *, jclass, jlong native_application) { native(native_application)->OnSurfaceCreated(); } JNI_METHOD(void, onDisplayGeometryChanged) (JNIEnv *, jobject, jlong native_application, int display_rotation, int width, int height) { native(native_application) ->OnDisplayGeometryChanged(display_rotation, width, height); } JNI_METHOD(void, onObjectRotationChanged) (JNIEnv *, jobject, jlong native_application, int rotation) { native(native_application) ->OnObjectRotationChanged(rotation); } JNI_METHOD(void, onAction) (JNIEnv *, jobject, jlong native_application, jfloat value) { native(native_application)->OnAction(value); } JNI_METHOD(void, onGlSurfaceDrawFrame) (JNIEnv *, jclass, jlong native_application) { native(native_application)->OnDrawFrame(); } JNI_METHOD(void, onTouchTranslate) (JNIEnv *, jclass, jlong native_application, jfloat x, jfloat y) { return native(native_application)->OnTouchTranslate(x, y); } JNI_METHOD(bool, onTouchedFirst) (JNIEnv *, jclass, jlong native_application, jfloat x, jfloat y, int drawMode) { return native(native_application)->OnTouchedFirst(x, y, drawMode); } JNI_METHOD(void, onTouchedFinal) (JNIEnv *, jclass, jlong native_application, int type) { native(native_application)->OnTouchedFinal(type); } JNI_METHOD(jboolean, hasDetectedPlanes) (JNIEnv *, jclass, jlong native_application) { return static_cast( native(native_application)->HasDetectedPlanes() ? JNI_TRUE : JNI_FALSE); } JNIEnv *GetJniEnv() { JNIEnv *env; jint result = g_vm->AttachCurrentThread(&env, nullptr); return result == JNI_OK ? env : nullptr; } jclass FindClass(const char *classname) { JNIEnv *env = GetJniEnv(); return env->FindClass(classname); } } // extern "C"