1b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood/* 2b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Copyright (C) 2011 The Android Open Source Project 3b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 4b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * you may not use this file except in compliance with the License. 6b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * You may obtain a copy of the License at 7b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 8b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 10b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Unless required by applicable law or agreed to in writing, software 11b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * See the License for the specific language governing permissions and 14b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * limitations under the License. 15b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 16b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 17b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#define LOG_TAG "SerialServiceJNI" 18b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include "utils/Log.h" 19b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 20b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include "jni.h" 21b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include "JNIHelp.h" 22b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include "android_runtime/AndroidRuntime.h" 23b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 24b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include <sys/types.h> 25b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include <sys/stat.h> 26b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include <fcntl.h> 27b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 28b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodnamespace android 29b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood{ 30b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 31b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodstatic struct parcel_file_descriptor_offsets_t 32b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood{ 33b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood jclass mClass; 34b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood jmethodID mConstructor; 35b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood} gParcelFileDescriptorOffsets; 36b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 3726872f4b9e634d77ecd78e4eee9d5d070f8553f8Andreas Gampestatic jobject android_server_SerialService_open(JNIEnv *env, jobject /* thiz */, jstring path) 38b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood{ 39b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood const char *pathStr = env->GetStringUTFChars(path, NULL); 40b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 41b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood int fd = open(pathStr, O_RDWR | O_NOCTTY); 42b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood if (fd < 0) { 43b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood ALOGE("could not open %s", pathStr); 44b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood env->ReleaseStringUTFChars(path, pathStr); 45b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return NULL; 46b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 47b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood env->ReleaseStringUTFChars(path, pathStr); 48b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 49b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood jobject fileDescriptor = jniCreateFileDescriptor(env, fd); 50b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood if (fileDescriptor == NULL) { 51b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return NULL; 52b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 53b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return env->NewObject(gParcelFileDescriptorOffsets.mClass, 54b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood gParcelFileDescriptorOffsets.mConstructor, fileDescriptor); 55b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood} 56b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 57b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 5876f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod method_table[] = { 59b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood { "native_open", "(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;", 60b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood (void*)android_server_SerialService_open }, 61b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood}; 62b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 63b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodint register_android_server_SerialService(JNIEnv *env) 64b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood{ 65b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood jclass clazz = env->FindClass("com/android/server/SerialService"); 66b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood if (clazz == NULL) { 67b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood ALOGE("Can't find com/android/server/SerialService"); 68b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return -1; 69b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 70b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 71b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood clazz = env->FindClass("android/os/ParcelFileDescriptor"); 72b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.ParcelFileDescriptor"); 73b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood gParcelFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 74b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood gParcelFileDescriptorOffsets.mConstructor = env->GetMethodID(clazz, "<init>", "(Ljava/io/FileDescriptor;)V"); 75b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood LOG_FATAL_IF(gParcelFileDescriptorOffsets.mConstructor == NULL, 76b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood "Unable to find constructor for android.os.ParcelFileDescriptor"); 77b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 78b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return jniRegisterNativeMethods(env, "com/android/server/SerialService", 79b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood method_table, NELEM(method_table)); 80b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood} 81b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 82b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood}; 83