/* * Copyright (C) 2016 The Android Open Source Project * * 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 <string.h> #include <cutils/log.h> #include <hardware/hardware.h> #include <hardware/vehicle_camera.h> #include <jni.h> #include <JNIHelp.h> #include <system/window.h> namespace android { /* * Class: com_android_car_CarCameraService * Method: nativeOpen * Signature: ()J */ static jlong com_android_car_CarCameraService_nativeOpen (JNIEnv *env, jobject obj) { vehicle_camera_module_t *module = NULL; hw_get_module(VEHICLE_CAMERA_HARDWARE_MODULE_ID, (const hw_module_t**)&module); if (module == NULL) { ALOGE("JNI Camera: nativeOpen failed!"); } return (jlong)module; } /* * Class: com_android_car_CarCameraService * Method: nativeClose * Signature: (J)V */ static void com_android_car_CarCameraService_nativeClose (JNIEnv *env, jobject, jlong dev) { vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev; if (device != NULL) { device->common.close((struct hw_device_t*)device); } } /* * Class: com_android_car_CarCameraService * Method: nativeGetSupportedCameras * Signature: (J)[I */ static jintArray com_android_car_CarCameraService_nativeGetSupportedCameras (JNIEnv *env, jobject, jlong mod) { int i; vehicle_camera_module_t *module = (vehicle_camera_module_t*)mod; const uint32_t *camera_list; uint32_t numCameras; jintArray outArray = NULL; camera_list = module->get_camera_device_list(&numCameras); if ((numCameras > 0) && (camera_list != NULL)) { outArray = env->NewIntArray(numCameras); } if (outArray == NULL) { return NULL; } // Copy camera list to output array env->SetIntArrayRegion(outArray, 0, numCameras, (jint*)camera_list); return outArray; } /* * Class: com_android_car_CarCameraService * Method: nativeGetDevice * Signature: (JI)J */ static jlong com_android_car_CarCameraService_nativeGetDevice (JNIEnv *env, jobject, jlong mod, jint cameraType) { const char *cameraTypeString[] = { VEHICLE_CAMERA_RVC_DEVICE, }; vehicle_camera_module_t *module = (vehicle_camera_module_t*)mod; hw_device_t *device = NULL; if (module != NULL) { module->common.methods->open((hw_module_t*)module, cameraTypeString[cameraType], &device); } if (device == NULL) { ALOGE("JNI Camera: nativeGetDevice failed!"); } return (jlong)device; } /* * Class: com_android_car_CarCameraService * Method: nativeGetCapabilities * Signature: (J)I */ static jint com_android_car_CarCameraService_nativeGetCapabilities (JNIEnv *env, jobject, jlong dev) { vehicle_camera_cap_t cap; jint capabilities = 0; vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev; if (device != NULL) { // Fetch the capabilities int errCode = device->get_capabilities(device, &cap); if (errCode == 0) { capabilities = cap.capabilites_flags; } else { ALOGE("JNI Camera: nativeGetCapabilites errCode = %d", errCode); } } else { ALOGE("JNI Camera: nativeGetCapabilities!"); } return capabilities; } /* * Class: com_android_car_CarCameraService * Method: nativeGetCameraCrop * Signature: (J)Landroid/graphics/Rect; */ static jobject com_android_car_CarCameraService_nativeGetCameraCrop (JNIEnv *env, jobject, jlong dev) { vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev; jobject retObj = NULL; if (device != NULL) { // Get the crop values android_native_rect_t rect; device->get_camera_crop(device, &rect); // Get the class jclass cls = env->FindClass("android/graphics/Rect"); jmethodID midInit = env->GetMethodID(cls, "<init>", "(IIII)V"); // Instantiate a new java CarRect objected with the current values retObj = env->NewObject(cls, midInit, rect.left, rect.top, rect.right, rect.bottom); } return retObj; } /* * Class: com_android_car_CarCameraService * Method: nativeSetCameraCrop * Signature: (JLandroid/graphics/Rect;)V */ static void com_android_car_CarCameraService_nativeSetCameraCrop (JNIEnv *env, jobject, jlong dev, jobject jrect) { vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev; if (device != NULL) { android_native_rect_t rect; jclass cls = env->GetObjectClass(jrect); jfieldID fidLeft = env->GetFieldID(cls, "left", "I"); jfieldID fidTop = env->GetFieldID(cls, "top", "I"); jfieldID fidRight = env->GetFieldID(cls, "right", "I"); jfieldID fidBottom = env->GetFieldID(cls, "bottom", "I"); rect.left = (uint32_t)env->GetIntField(jrect, fidLeft); rect.top = (uint32_t)env->GetIntField(jrect, fidTop); rect.right = (uint32_t)env->GetIntField(jrect, fidRight); rect.bottom = (uint32_t)env->GetIntField(jrect, fidBottom); device->set_camera_crop(device, &rect); } } /* * Class: com_android_car_CarCameraService * Method: nativeGetCameraPosition * Signature: (J)Landroid/graphics/Rect; */ static jobject com_android_car_CarCameraService_nativeGetCameraPosition (JNIEnv *env, jobject, jlong dev) { vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev; jobject retObj = NULL; if (device != NULL) { // Get the position values android_native_rect_t rect; device->get_camera_position(device, &rect); // Get the class jclass cls = env->FindClass("android/graphics/Rect"); jmethodID midInit = env->GetMethodID(cls, "<init>", "(IIII)V"); // Instantiate a new java CarRect objected with the current values retObj = env->NewObject(cls, midInit, rect.left, rect.top, rect.right, rect.bottom); } return retObj; } /* * Class: com_android_car_CarCameraService * Method: nativeSetCameraPosition * Signature: (JLandroid/graphics/Rect;)V */ static void com_android_car_CarCameraService_nativeSetCameraPosition (JNIEnv *env, jobject, jlong dev, jobject jrect) { vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev; if (device != NULL) { android_native_rect_t rect; jclass cls = env->GetObjectClass(jrect); jfieldID fidLeft = env->GetFieldID(cls, "left", "I"); jfieldID fidTop = env->GetFieldID(cls, "top", "I"); jfieldID fidRight = env->GetFieldID(cls, "right", "I"); jfieldID fidBottom = env->GetFieldID(cls, "bottom", "I"); rect.left = (uint32_t)env->GetIntField(jrect, fidLeft); rect.top = (uint32_t)env->GetIntField(jrect, fidTop); rect.right = (uint32_t)env->GetIntField(jrect, fidRight); rect.bottom = (uint32_t)env->GetIntField(jrect, fidBottom); device->set_camera_position(device, &rect); } } /* * Class: com_android_car_CarCameraService * Method: nativeGetCameraState * Signature: (J)Landroid/car/hardware/camera/CarCameraState; */ static jobject com_android_car_CarCameraService_nativeGetCameraState (JNIEnv *env, jobject, jlong dev) { vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev; jobject retObj = NULL; if (device != NULL) { vehicle_camera_state_t state; device->get_camera_state(device, &state); // Get the class jclass cls = env->FindClass("android/car/hardware/camera/CarCameraState"); jmethodID midInit = env->GetMethodID(cls, "<init>", "(ZZ)V"); // Instantiate a new java CarRect objected with the current values retObj = env->NewObject(cls, midInit, state.overlay_on, state.camera_on); } return retObj; } /* * Class: com_android_car_CarCameraService * Method: nativeSetCameraState * Signature: (JLandroid/car/hardware/camera/CarCameraState;)V */ static void com_android_car_CarCameraService_nativeSetCameraState (JNIEnv *env, jobject, jlong dev, jobject jstate) { vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev; if (device != NULL) { vehicle_camera_state_t state; jclass cls = env->GetObjectClass(jstate); jmethodID midCamera = env->GetMethodID(cls, "getCameraIsOn", "()Z"); jmethodID midOverlay = env->GetMethodID(cls, "getOverlayIsOn", "()Z"); state.overlay_on = (uint32_t)env->CallBooleanMethod(jstate, midOverlay); state.camera_on = (uint32_t)env->CallBooleanMethod(jstate, midCamera); device->set_camera_state(device, &state); } } static JNINativeMethod gMethods[] = { { "nativeOpen", "()J", (void*)com_android_car_CarCameraService_nativeOpen }, { "nativeClose", "(J)V", (void*)com_android_car_CarCameraService_nativeClose }, { "nativeGetSupportedCameras", "(J)[I", (void*)com_android_car_CarCameraService_nativeGetSupportedCameras }, { "nativeGetDevice", "(JI)J", (void*)com_android_car_CarCameraService_nativeGetDevice }, { "nativeGetCapabilities", "(J)I", (void*)com_android_car_CarCameraService_nativeGetCapabilities }, { "nativeGetCameraCrop", "(J)Landroid/graphics/Rect;", (void*)com_android_car_CarCameraService_nativeGetCameraCrop }, { "nativeSetCameraCrop", "(JLandroid/graphics/Rect;)V", (void*)com_android_car_CarCameraService_nativeSetCameraCrop }, { "nativeGetCameraPosition", "(J)Landroid/graphics/Rect;", (void*)com_android_car_CarCameraService_nativeGetCameraPosition }, { "nativeSetCameraPosition", "(JLandroid/graphics/Rect;)V", (void*)com_android_car_CarCameraService_nativeSetCameraPosition }, { "nativeGetCameraState", "(J)Landroid/car/hardware/camera/CarCameraState;", (void*)com_android_car_CarCameraService_nativeGetCameraState }, { "nativeSetCameraState", "(JLandroid/car/hardware/camera/CarCameraState;)V", (void*)com_android_car_CarCameraService_nativeSetCameraState }, }; int register_com_android_car_CarCameraService(JNIEnv *env) { return jniRegisterNativeMethods(env, "com/android/car/CarCameraService", gMethods, NELEM(gMethods)); } } // namespace android