1 /*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <string.h>
18 #include <cutils/log.h>
19 #include <hardware/hardware.h>
20 #include <hardware/vehicle_camera.h>
21 #include <jni.h>
22 #include <JNIHelp.h>
23 #include <system/window.h>
24
25 namespace android {
26
27 /*
28 * Class: com_android_car_CarCameraService
29 * Method: nativeOpen
30 * Signature: ()J
31 */
com_android_car_CarCameraService_nativeOpen(JNIEnv * env,jobject obj)32 static jlong com_android_car_CarCameraService_nativeOpen
33 (JNIEnv *env, jobject obj)
34 {
35 vehicle_camera_module_t *module = NULL;
36
37 hw_get_module(VEHICLE_CAMERA_HARDWARE_MODULE_ID, (const hw_module_t**)&module);
38
39 if (module == NULL) {
40 ALOGE("JNI Camera: nativeOpen failed!");
41 }
42 return (jlong)module;
43 }
44
45 /*
46 * Class: com_android_car_CarCameraService
47 * Method: nativeClose
48 * Signature: (J)V
49 */
com_android_car_CarCameraService_nativeClose(JNIEnv * env,jobject,jlong dev)50 static void com_android_car_CarCameraService_nativeClose
51 (JNIEnv *env, jobject, jlong dev)
52 {
53 vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev;
54
55 if (device != NULL) {
56 device->common.close((struct hw_device_t*)device);
57 }
58 }
59
60 /*
61 * Class: com_android_car_CarCameraService
62 * Method: nativeGetSupportedCameras
63 * Signature: (J)[I
64 */
com_android_car_CarCameraService_nativeGetSupportedCameras(JNIEnv * env,jobject,jlong mod)65 static jintArray com_android_car_CarCameraService_nativeGetSupportedCameras
66 (JNIEnv *env, jobject, jlong mod)
67 {
68 int i;
69 vehicle_camera_module_t *module = (vehicle_camera_module_t*)mod;
70 const uint32_t *camera_list;
71 uint32_t numCameras;
72 jintArray outArray = NULL;
73
74 camera_list = module->get_camera_device_list(&numCameras);
75
76 if ((numCameras > 0) && (camera_list != NULL)) {
77 outArray = env->NewIntArray(numCameras);
78 }
79
80 if (outArray == NULL) {
81 return NULL;
82 }
83 // Copy camera list to output array
84 env->SetIntArrayRegion(outArray, 0, numCameras, (jint*)camera_list);
85 return outArray;
86 }
87
88 /*
89 * Class: com_android_car_CarCameraService
90 * Method: nativeGetDevice
91 * Signature: (JI)J
92 */
com_android_car_CarCameraService_nativeGetDevice(JNIEnv * env,jobject,jlong mod,jint cameraType)93 static jlong com_android_car_CarCameraService_nativeGetDevice
94 (JNIEnv *env, jobject, jlong mod, jint cameraType)
95 {
96 const char *cameraTypeString[] = {
97 VEHICLE_CAMERA_RVC_DEVICE,
98 };
99 vehicle_camera_module_t *module = (vehicle_camera_module_t*)mod;
100 hw_device_t *device = NULL;
101
102 if (module != NULL) {
103 module->common.methods->open((hw_module_t*)module, cameraTypeString[cameraType], &device);
104 }
105
106 if (device == NULL) {
107 ALOGE("JNI Camera: nativeGetDevice failed!");
108 }
109 return (jlong)device;
110 }
111
112
113 /*
114 * Class: com_android_car_CarCameraService
115 * Method: nativeGetCapabilities
116 * Signature: (J)I
117 */
com_android_car_CarCameraService_nativeGetCapabilities(JNIEnv * env,jobject,jlong dev)118 static jint com_android_car_CarCameraService_nativeGetCapabilities
119 (JNIEnv *env, jobject, jlong dev)
120 {
121 vehicle_camera_cap_t cap;
122 jint capabilities = 0;
123 vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev;
124 if (device != NULL) {
125 // Fetch the capabilities
126 int errCode = device->get_capabilities(device, &cap);
127
128 if (errCode == 0) {
129 capabilities = cap.capabilites_flags;
130 } else {
131 ALOGE("JNI Camera: nativeGetCapabilites errCode = %d", errCode);
132 }
133 } else {
134 ALOGE("JNI Camera: nativeGetCapabilities!");
135 }
136
137 return capabilities;
138 }
139
140 /*
141 * Class: com_android_car_CarCameraService
142 * Method: nativeGetCameraCrop
143 * Signature: (J)Landroid/graphics/Rect;
144 */
com_android_car_CarCameraService_nativeGetCameraCrop(JNIEnv * env,jobject,jlong dev)145 static jobject com_android_car_CarCameraService_nativeGetCameraCrop
146 (JNIEnv *env, jobject, jlong dev)
147 {
148 vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev;
149 jobject retObj = NULL;
150
151 if (device != NULL) {
152 // Get the crop values
153 android_native_rect_t rect;
154 device->get_camera_crop(device, &rect);
155
156 // Get the class
157 jclass cls = env->FindClass("android/graphics/Rect");
158 jmethodID midInit = env->GetMethodID(cls, "<init>", "(IIII)V");
159
160 // Instantiate a new java CarRect objected with the current values
161 retObj = env->NewObject(cls, midInit, rect.left, rect.top, rect.right, rect.bottom);
162 }
163
164 return retObj;
165 }
166
167 /*
168 * Class: com_android_car_CarCameraService
169 * Method: nativeSetCameraCrop
170 * Signature: (JLandroid/graphics/Rect;)V
171 */
com_android_car_CarCameraService_nativeSetCameraCrop(JNIEnv * env,jobject,jlong dev,jobject jrect)172 static void com_android_car_CarCameraService_nativeSetCameraCrop
173 (JNIEnv *env, jobject, jlong dev, jobject jrect)
174 {
175 vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev;
176 if (device != NULL) {
177 android_native_rect_t rect;
178
179 jclass cls = env->GetObjectClass(jrect);
180 jfieldID fidLeft = env->GetFieldID(cls, "left", "I");
181 jfieldID fidTop = env->GetFieldID(cls, "top", "I");
182 jfieldID fidRight = env->GetFieldID(cls, "right", "I");
183 jfieldID fidBottom = env->GetFieldID(cls, "bottom", "I");
184
185 rect.left = (uint32_t)env->GetIntField(jrect, fidLeft);
186 rect.top = (uint32_t)env->GetIntField(jrect, fidTop);
187 rect.right = (uint32_t)env->GetIntField(jrect, fidRight);
188 rect.bottom = (uint32_t)env->GetIntField(jrect, fidBottom);
189
190 device->set_camera_crop(device, &rect);
191 }
192 }
193
194 /*
195 * Class: com_android_car_CarCameraService
196 * Method: nativeGetCameraPosition
197 * Signature: (J)Landroid/graphics/Rect;
198 */
com_android_car_CarCameraService_nativeGetCameraPosition(JNIEnv * env,jobject,jlong dev)199 static jobject com_android_car_CarCameraService_nativeGetCameraPosition
200 (JNIEnv *env, jobject, jlong dev)
201 {
202 vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev;
203 jobject retObj = NULL;
204
205 if (device != NULL) {
206 // Get the position values
207 android_native_rect_t rect;
208 device->get_camera_position(device, &rect);
209
210 // Get the class
211 jclass cls = env->FindClass("android/graphics/Rect");
212 jmethodID midInit = env->GetMethodID(cls, "<init>", "(IIII)V");
213
214 // Instantiate a new java CarRect objected with the current values
215 retObj = env->NewObject(cls, midInit, rect.left, rect.top, rect.right, rect.bottom);
216 }
217
218 return retObj;
219 }
220
221
222 /*
223 * Class: com_android_car_CarCameraService
224 * Method: nativeSetCameraPosition
225 * Signature: (JLandroid/graphics/Rect;)V
226 */
com_android_car_CarCameraService_nativeSetCameraPosition(JNIEnv * env,jobject,jlong dev,jobject jrect)227 static void com_android_car_CarCameraService_nativeSetCameraPosition
228 (JNIEnv *env, jobject, jlong dev, jobject jrect)
229 {
230 vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev;
231 if (device != NULL) {
232 android_native_rect_t rect;
233
234 jclass cls = env->GetObjectClass(jrect);
235 jfieldID fidLeft = env->GetFieldID(cls, "left", "I");
236 jfieldID fidTop = env->GetFieldID(cls, "top", "I");
237 jfieldID fidRight = env->GetFieldID(cls, "right", "I");
238 jfieldID fidBottom = env->GetFieldID(cls, "bottom", "I");
239
240 rect.left = (uint32_t)env->GetIntField(jrect, fidLeft);
241 rect.top = (uint32_t)env->GetIntField(jrect, fidTop);
242 rect.right = (uint32_t)env->GetIntField(jrect, fidRight);
243 rect.bottom = (uint32_t)env->GetIntField(jrect, fidBottom);
244
245 device->set_camera_position(device, &rect);
246 }
247 }
248
249 /*
250 * Class: com_android_car_CarCameraService
251 * Method: nativeGetCameraState
252 * Signature: (J)Landroid/car/hardware/camera/CarCameraState;
253 */
com_android_car_CarCameraService_nativeGetCameraState(JNIEnv * env,jobject,jlong dev)254 static jobject com_android_car_CarCameraService_nativeGetCameraState
255 (JNIEnv *env, jobject, jlong dev)
256 {
257 vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev;
258 jobject retObj = NULL;
259
260 if (device != NULL) {
261 vehicle_camera_state_t state;
262 device->get_camera_state(device, &state);
263
264 // Get the class
265 jclass cls = env->FindClass("android/car/hardware/camera/CarCameraState");
266 jmethodID midInit = env->GetMethodID(cls, "<init>", "(ZZ)V");
267
268 // Instantiate a new java CarRect objected with the current values
269 retObj = env->NewObject(cls, midInit, state.overlay_on, state.camera_on);
270 }
271
272 return retObj;
273 }
274
275
276 /*
277 * Class: com_android_car_CarCameraService
278 * Method: nativeSetCameraState
279 * Signature: (JLandroid/car/hardware/camera/CarCameraState;)V
280 */
com_android_car_CarCameraService_nativeSetCameraState(JNIEnv * env,jobject,jlong dev,jobject jstate)281 static void com_android_car_CarCameraService_nativeSetCameraState
282 (JNIEnv *env, jobject, jlong dev, jobject jstate)
283 {
284 vehicle_camera_device_t *device = (vehicle_camera_device_t*)dev;
285 if (device != NULL) {
286 vehicle_camera_state_t state;
287
288 jclass cls = env->GetObjectClass(jstate);
289 jmethodID midCamera = env->GetMethodID(cls, "getCameraIsOn", "()Z");
290 jmethodID midOverlay = env->GetMethodID(cls, "getOverlayIsOn", "()Z");
291
292 state.overlay_on = (uint32_t)env->CallBooleanMethod(jstate, midOverlay);
293 state.camera_on = (uint32_t)env->CallBooleanMethod(jstate, midCamera);
294
295 device->set_camera_state(device, &state);
296 }
297 }
298
299 static JNINativeMethod gMethods[] = {
300 { "nativeOpen", "()J", (void*)com_android_car_CarCameraService_nativeOpen },
301 { "nativeClose", "(J)V", (void*)com_android_car_CarCameraService_nativeClose },
302 { "nativeGetSupportedCameras", "(J)[I", (void*)com_android_car_CarCameraService_nativeGetSupportedCameras },
303 { "nativeGetDevice", "(JI)J", (void*)com_android_car_CarCameraService_nativeGetDevice },
304 { "nativeGetCapabilities", "(J)I", (void*)com_android_car_CarCameraService_nativeGetCapabilities },
305 { "nativeGetCameraCrop", "(J)Landroid/graphics/Rect;", (void*)com_android_car_CarCameraService_nativeGetCameraCrop },
306 { "nativeSetCameraCrop", "(JLandroid/graphics/Rect;)V", (void*)com_android_car_CarCameraService_nativeSetCameraCrop },
307 { "nativeGetCameraPosition", "(J)Landroid/graphics/Rect;", (void*)com_android_car_CarCameraService_nativeGetCameraPosition },
308 { "nativeSetCameraPosition", "(JLandroid/graphics/Rect;)V", (void*)com_android_car_CarCameraService_nativeSetCameraPosition },
309 { "nativeGetCameraState", "(J)Landroid/car/hardware/camera/CarCameraState;", (void*)com_android_car_CarCameraService_nativeGetCameraState },
310 { "nativeSetCameraState", "(JLandroid/car/hardware/camera/CarCameraState;)V", (void*)com_android_car_CarCameraService_nativeSetCameraState },
311 };
312
register_com_android_car_CarCameraService(JNIEnv * env)313 int register_com_android_car_CarCameraService(JNIEnv *env) {
314 return jniRegisterNativeMethods(env, "com/android/car/CarCameraService",
315 gMethods, NELEM(gMethods));
316 }
317
318 } // namespace android
319
320
321