198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood/* 298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * Copyright (C) 2010 The Android Open Source Project 398ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * 498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * you may not use this file except in compliance with the License. 698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * You may obtain a copy of the License at 798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * 898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * 1098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * Unless required by applicable law or agreed to in writing, software 1198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 1298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1398ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * See the License for the specific language governing permissions and 1498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * limitations under the License. 1598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood */ 1698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 1798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#define LOG_TAG "MtpServerJNI" 1898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "utils/Log.h" 1998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 2098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <stdio.h> 2198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <assert.h> 2298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <limits.h> 2398ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <unistd.h> 2498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <fcntl.h> 2598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <utils/threads.h> 2698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 2798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "jni.h" 2898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "JNIHelp.h" 2998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "android_runtime/AndroidRuntime.h" 30dad69277b7fdcc2759bec5a35ac45dae8f61ec9bMike Lockwood#include "private/android_filesystem_config.h" 3198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 3298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "MtpServer.h" 33467ca0de6d7fd55787a37de9dfd7e5325e1c3c6fMike Lockwood#include "MtpStorage.h" 3498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 3581ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwoodusing namespace android; 3698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 37dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood// MtpServer fields 38dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwoodstatic jfieldID field_MtpServer_nativeContext; 39b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood 40b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood// MtpStorage fields 41b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic jfieldID field_MtpStorage_storageId; 42b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic jfieldID field_MtpStorage_path; 43b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic jfieldID field_MtpStorage_description; 44b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic jfieldID field_MtpStorage_reserveSpace; 4551690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwoodstatic jfieldID field_MtpStorage_removable; 467a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwoodstatic jfieldID field_MtpStorage_maxFileSize; 47b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood 48b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic Mutex sMutex; 49b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood 5098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood// ---------------------------------------------------------------------------- 5198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 520cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood// in android_mtp_MtpDatabase.cpp 53d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodextern MtpDatabase* getMtpDatabase(JNIEnv *env, jobject database); 5498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 55dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwoodstatic inline MtpServer* getMtpServer(JNIEnv *env, jobject thiz) { 56e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat return (MtpServer*)env->GetLongField(thiz, field_MtpServer_nativeContext); 5798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood} 5898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 5998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwoodstatic void 607d40d42a364f520da853b41956b0a18ed172491bMike Lockwoodandroid_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jboolean usePtp) 6198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood{ 62dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood int fd = open("/dev/mtp_usb", O_RDWR); 63dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood if (fd >= 0) { 64dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood MtpServer* server = new MtpServer(fd, getMtpDatabase(env, javaDatabase), 65dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood usePtp, AID_MEDIA_RW, 0664, 0775); 66e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat env->SetLongField(thiz, field_MtpServer_nativeContext, (jlong)server); 67dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood } else { 683762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("could not open MTP driver, errno: %d", errno); 69dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood } 7098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood} 7198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 7298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwoodstatic void 73dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwoodandroid_mtp_MtpServer_run(JNIEnv *env, jobject thiz) 7498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood{ 75dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood MtpServer* server = getMtpServer(env, thiz); 76dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood if (server) 77dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood server->run(); 78dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood else 793762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("server is null in run"); 8098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood} 8198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 8298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwoodstatic void 83dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwoodandroid_mtp_MtpServer_cleanup(JNIEnv *env, jobject thiz) 8498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood{ 85dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood Mutex::Autolock autoLock(sMutex); 86dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood 87dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood MtpServer* server = getMtpServer(env, thiz); 88dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood if (server) { 89dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood delete server; 90e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat env->SetLongField(thiz, field_MtpServer_nativeContext, 0); 91dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood } else { 923762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("server is null in cleanup"); 93071b2b6739c83d3de806cda5d7be2aba33fde1afMike Lockwood } 9498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood} 9598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 96be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwoodstatic void 970cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodandroid_mtp_MtpServer_send_object_added(JNIEnv *env, jobject thiz, jint handle) 98be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood{ 99dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood Mutex::Autolock autoLock(sMutex); 100dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood 101dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood MtpServer* server = getMtpServer(env, thiz); 102dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood if (server) 103dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood server->sendObjectAdded(handle); 104dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood else 1053762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("server is null in send_object_added"); 106be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood} 107be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood 108be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwoodstatic void 1090cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodandroid_mtp_MtpServer_send_object_removed(JNIEnv *env, jobject thiz, jint handle) 110be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood{ 111dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood Mutex::Autolock autoLock(sMutex); 112dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood 113dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood MtpServer* server = getMtpServer(env, thiz); 114dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood if (server) 115dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood server->sendObjectRemoved(handle); 116dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood else 1173762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("server is null in send_object_removed"); 118be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood} 119be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood 120eabe8bfaf8c45289a4cfd880f4107d1a9b17e38bMike Lockwoodstatic void 12156c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwoodandroid_mtp_MtpServer_send_device_property_changed(JNIEnv *env, jobject thiz, jint property) 12256c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood{ 12356c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood Mutex::Autolock autoLock(sMutex); 12456c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood 12556c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood MtpServer* server = getMtpServer(env, thiz); 12656c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood if (server) 12756c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood server->sendDevicePropertyChanged(property); 12856c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood else 12956c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood ALOGE("server is null in send_object_removed"); 13056c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood} 13156c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood 13256c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwoodstatic void 133b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodandroid_mtp_MtpServer_add_storage(JNIEnv *env, jobject thiz, jobject jstorage) 13466e57f6aa9d206552e9b154bf00a17d6efae7fb0Mike Lockwood{ 135dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood Mutex::Autolock autoLock(sMutex); 136dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood 137dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood MtpServer* server = getMtpServer(env, thiz); 138dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood if (server) { 139b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood jint storageID = env->GetIntField(jstorage, field_MtpStorage_storageId); 140b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood jstring path = (jstring)env->GetObjectField(jstorage, field_MtpStorage_path); 141b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood jstring description = (jstring)env->GetObjectField(jstorage, field_MtpStorage_description); 142b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood jlong reserveSpace = env->GetLongField(jstorage, field_MtpStorage_reserveSpace); 14351690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood jboolean removable = env->GetBooleanField(jstorage, field_MtpStorage_removable); 1447a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood jlong maxFileSize = env->GetLongField(jstorage, field_MtpStorage_maxFileSize); 145b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood 146b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood const char *pathStr = env->GetStringUTFChars(path, NULL); 1473977472d9f3380a8323156dbc7d0090cf2f2d310James Dong if (pathStr != NULL) { 1483977472d9f3380a8323156dbc7d0090cf2f2d310James Dong const char *descriptionStr = env->GetStringUTFChars(description, NULL); 1493977472d9f3380a8323156dbc7d0090cf2f2d310James Dong if (descriptionStr != NULL) { 1507a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood MtpStorage* storage = new MtpStorage(storageID, pathStr, descriptionStr, 1517a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood reserveSpace, removable, maxFileSize); 152dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood server->addStorage(storage); 1533977472d9f3380a8323156dbc7d0090cf2f2d310James Dong env->ReleaseStringUTFChars(path, pathStr); 1543977472d9f3380a8323156dbc7d0090cf2f2d310James Dong env->ReleaseStringUTFChars(description, descriptionStr); 1553977472d9f3380a8323156dbc7d0090cf2f2d310James Dong } else { 1563977472d9f3380a8323156dbc7d0090cf2f2d310James Dong env->ReleaseStringUTFChars(path, pathStr); 1573977472d9f3380a8323156dbc7d0090cf2f2d310James Dong } 1583977472d9f3380a8323156dbc7d0090cf2f2d310James Dong } 159b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood } else { 1603762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("server is null in add_storage"); 161b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood } 162b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood} 163b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood 164b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic void 165b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodandroid_mtp_MtpServer_remove_storage(JNIEnv *env, jobject thiz, jint storageId) 166b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood{ 167dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood Mutex::Autolock autoLock(sMutex); 168dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood 169dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood MtpServer* server = getMtpServer(env, thiz); 170dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood if (server) { 171dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood MtpStorage* storage = server->getStorage(storageId); 172dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood if (storage) { 173dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood server->removeStorage(storage); 174dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood delete storage; 175dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood } 176dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood } else 1773762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("server is null in remove_storage"); 17866e57f6aa9d206552e9b154bf00a17d6efae7fb0Mike Lockwood} 17966e57f6aa9d206552e9b154bf00a17d6efae7fb0Mike Lockwood 18098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood// ---------------------------------------------------------------------------- 18198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 18276f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 1837d40d42a364f520da853b41956b0a18ed172491bMike Lockwood {"native_setup", "(Landroid/mtp/MtpDatabase;Z)V", 1840cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood (void *)android_mtp_MtpServer_setup}, 185dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood {"native_run", "()V", (void *)android_mtp_MtpServer_run}, 186dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood {"native_cleanup", "()V", (void *)android_mtp_MtpServer_cleanup}, 1870cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood {"native_send_object_added", "(I)V", (void *)android_mtp_MtpServer_send_object_added}, 1880cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood {"native_send_object_removed", "(I)V", (void *)android_mtp_MtpServer_send_object_removed}, 18956c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood {"native_send_device_property_changed", "(I)V", 19056c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood (void *)android_mtp_MtpServer_send_device_property_changed}, 191b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood {"native_add_storage", "(Landroid/mtp/MtpStorage;)V", 192b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood (void *)android_mtp_MtpServer_add_storage}, 193b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood {"native_remove_storage", "(I)V", (void *)android_mtp_MtpServer_remove_storage}, 19498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood}; 19598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 1960cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodint register_android_mtp_MtpServer(JNIEnv *env) 19798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood{ 19898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood jclass clazz; 19998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 200b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood clazz = env->FindClass("android/mtp/MtpStorage"); 201b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood if (clazz == NULL) { 2023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/mtp/MtpStorage"); 203b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood return -1; 204b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood } 205b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood field_MtpStorage_storageId = env->GetFieldID(clazz, "mStorageId", "I"); 206b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood if (field_MtpStorage_storageId == NULL) { 2073762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find MtpStorage.mStorageId"); 208b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood return -1; 209b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood } 210b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood field_MtpStorage_path = env->GetFieldID(clazz, "mPath", "Ljava/lang/String;"); 211b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood if (field_MtpStorage_path == NULL) { 2123762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find MtpStorage.mPath"); 213b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood return -1; 214b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood } 215b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood field_MtpStorage_description = env->GetFieldID(clazz, "mDescription", "Ljava/lang/String;"); 216b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood if (field_MtpStorage_description == NULL) { 2173762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find MtpStorage.mDescription"); 218b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood return -1; 219b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood } 220b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood field_MtpStorage_reserveSpace = env->GetFieldID(clazz, "mReserveSpace", "J"); 221b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood if (field_MtpStorage_reserveSpace == NULL) { 2223762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find MtpStorage.mReserveSpace"); 22351690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood return -1; 22451690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood } 22551690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood field_MtpStorage_removable = env->GetFieldID(clazz, "mRemovable", "Z"); 22651690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood if (field_MtpStorage_removable == NULL) { 2273762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find MtpStorage.mRemovable"); 228b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood return -1; 229b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood } 2307a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood field_MtpStorage_maxFileSize = env->GetFieldID(clazz, "mMaxFileSize", "J"); 2317a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood if (field_MtpStorage_maxFileSize == NULL) { 2323762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find MtpStorage.mMaxFileSize"); 2337a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood return -1; 2347a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood } 235b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood 2360cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood clazz = env->FindClass("android/mtp/MtpServer"); 23798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood if (clazz == NULL) { 2383762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/mtp/MtpServer"); 23998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood return -1; 24098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood } 241e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat field_MtpServer_nativeContext = env->GetFieldID(clazz, "mNativeContext", "J"); 242dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood if (field_MtpServer_nativeContext == NULL) { 2433762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find MtpServer.mNativeContext"); 244dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood return -1; 245dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood } 24698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood 24798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood return AndroidRuntime::registerNativeMethods(env, 2480cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood "android/mtp/MtpServer", gMethods, NELEM(gMethods)); 24998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood} 250