/* * Copyright (C) 2011 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. */ #define LOG_TAG "SerialServiceJNI" #include "utils/Log.h" #include "jni.h" #include "JNIHelp.h" #include "android_runtime/AndroidRuntime.h" #include #include #include namespace android { static struct parcel_file_descriptor_offsets_t { jclass mClass; jmethodID mConstructor; } gParcelFileDescriptorOffsets; static jobject android_server_SerialService_open(JNIEnv *env, jobject thiz, jstring path) { const char *pathStr = env->GetStringUTFChars(path, NULL); int fd = open(pathStr, O_RDWR | O_NOCTTY); if (fd < 0) { ALOGE("could not open %s", pathStr); env->ReleaseStringUTFChars(path, pathStr); return NULL; } env->ReleaseStringUTFChars(path, pathStr); jobject fileDescriptor = jniCreateFileDescriptor(env, fd); if (fileDescriptor == NULL) { return NULL; } return env->NewObject(gParcelFileDescriptorOffsets.mClass, gParcelFileDescriptorOffsets.mConstructor, fileDescriptor); } static JNINativeMethod method_table[] = { { "native_open", "(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;", (void*)android_server_SerialService_open }, }; int register_android_server_SerialService(JNIEnv *env) { jclass clazz = env->FindClass("com/android/server/SerialService"); if (clazz == NULL) { ALOGE("Can't find com/android/server/SerialService"); return -1; } clazz = env->FindClass("android/os/ParcelFileDescriptor"); LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.ParcelFileDescriptor"); gParcelFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); gParcelFileDescriptorOffsets.mConstructor = env->GetMethodID(clazz, "", "(Ljava/io/FileDescriptor;)V"); LOG_FATAL_IF(gParcelFileDescriptorOffsets.mConstructor == NULL, "Unable to find constructor for android.os.ParcelFileDescriptor"); return jniRegisterNativeMethods(env, "com/android/server/SerialService", method_table, NELEM(method_table)); } };