| /* |
| * 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 |
| |
| |