19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/libs/android_runtime/android_util_Process.cpp 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 5dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes** Licensed under the Apache License, Version 2.0 (the "License"); 6dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes** you may not use this file except in compliance with the License. 7dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 9dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 11dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes** Unless required by applicable law or agreed to in writing, software 12dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes** distributed under the License is distributed on an "AS IS" BASIS, 13dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "FileUtils" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/errno.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/stat.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <signal.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/ioctl.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <linux/msdos_fs.h> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusDevFieldID; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusInoFieldID; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusModeFieldID; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusNlinkFieldID; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusUidFieldID; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusGidFieldID; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusSizeFieldID; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusBlksizeFieldID; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusBlocksFieldID; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusAtimeFieldID; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusMtimeFieldID; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gFileStatusCtimeFieldID; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_FileUtils_setPermissions(JNIEnv* env, jobject clazz, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring file, jint mode, 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint uid, jint gid) 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(file, 0); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 file8; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str) { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file8 = String8(str, env->GetStringLength(file)); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(file, str); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (file8.size() <= 0) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ENOENT; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uid >= 0 || gid >= 0) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = chown(file8.string(), uid, gid); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != 0) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return errno; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return chmod(file8.string(), mode) == 0 ? 0 : errno; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_FileUtils_getPermissions(JNIEnv* env, jobject clazz, 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring file, jintArray outArray) 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(file, 0); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 file8; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file8 = String8(str, env->GetStringLength(file)); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(file, str); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (file8.size() <= 0) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ENOENT; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct stat st; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stat(file8.string(), &st) != 0) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return errno; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* array = (jint*)env->GetPrimitiveArrayCritical(outArray, 0); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (array) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = env->GetArrayLength(outArray); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len >= 1) { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array[0] = st.st_mode; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len >= 2) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array[1] = st.st_uid; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len >= 3) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array[2] = st.st_gid; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(outArray, array, 0); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10490960e87ecae696f73ae18e46c2f003fc3f592ccMike Lockwoodjint android_os_FileUtils_setUMask(JNIEnv* env, jobject clazz, jint mask) 10590960e87ecae696f73ae18e46c2f003fc3f592ccMike Lockwood{ 10690960e87ecae696f73ae18e46c2f003fc3f592ccMike Lockwood return umask(mask); 10790960e87ecae696f73ae18e46c2f003fc3f592ccMike Lockwood} 10890960e87ecae696f73ae18e46c2f003fc3f592ccMike Lockwood 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_FileUtils_getFatVolumeId(JNIEnv* env, jobject clazz, jstring path) 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (path == NULL) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *pathStr = env->GetStringUTFChars(path, NULL); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = -1; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // only if our system supports this ioctl 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #ifdef VFAT_IOCTL_GET_VOLUME_ID 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fd = open(pathStr, O_RDONLY); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd >= 0) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ioctl(fd, VFAT_IOCTL_GET_VOLUME_ID); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #endif 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(path, pathStr); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean android_os_FileUtils_getFileStatus(JNIEnv* env, jobject clazz, jstring path, jobject fileStatus) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* pathStr = env->GetStringUTFChars(path, NULL); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean ret = false; 133dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct stat s; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = stat(pathStr, &s); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res == 0) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = true; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fileStatus != NULL) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(fileStatus, gFileStatusDevFieldID, s.st_dev); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(fileStatus, gFileStatusInoFieldID, s.st_ino); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(fileStatus, gFileStatusModeFieldID, s.st_mode); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(fileStatus, gFileStatusNlinkFieldID, s.st_nlink); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(fileStatus, gFileStatusUidFieldID, s.st_uid); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(fileStatus, gFileStatusGidFieldID, s.st_gid); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetLongField(fileStatus, gFileStatusSizeFieldID, s.st_size); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(fileStatus, gFileStatusBlksizeFieldID, s.st_blksize); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetLongField(fileStatus, gFileStatusBlocksFieldID, s.st_blocks); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetLongField(fileStatus, gFileStatusAtimeFieldID, s.st_atime); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetLongField(fileStatus, gFileStatusMtimeFieldID, s.st_mtime); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetLongField(fileStatus, gFileStatusCtimeFieldID, s.st_ctime); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 153dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(path, pathStr); 155dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod methods[] = { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setPermissions", "(Ljava/lang/String;III)I", (void*)android_os_FileUtils_setPermissions}, 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getPermissions", "(Ljava/lang/String;[I)I", (void*)android_os_FileUtils_getPermissions}, 16290960e87ecae696f73ae18e46c2f003fc3f592ccMike Lockwood {"setUMask", "(I)I", (void*)android_os_FileUtils_setUMask}, 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getFatVolumeId", "(Ljava/lang/String;)I", (void*)android_os_FileUtils_getFatVolumeId}, 1644e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick {"getFileStatusNative", "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z", (void*)android_os_FileUtils_getFileStatus}, 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* const kFileUtilsPathName = "android/os/FileUtils"; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_FileUtils(JNIEnv* env) 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 171b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro jclass fileStatusClass = env->FindClass("android/os/FileUtils$FileStatus"); 172b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro LOG_FATAL_IF(fileStatusClass == NULL, "Unable to find class android.os.FileUtils$FileStatus"); 173b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro 174b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusDevFieldID = env->GetFieldID(fileStatusClass, "dev", "I"); 175b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusInoFieldID = env->GetFieldID(fileStatusClass, "ino", "I"); 176b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusModeFieldID = env->GetFieldID(fileStatusClass, "mode", "I"); 177b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusNlinkFieldID = env->GetFieldID(fileStatusClass, "nlink", "I"); 178b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusUidFieldID = env->GetFieldID(fileStatusClass, "uid", "I"); 179b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusGidFieldID = env->GetFieldID(fileStatusClass, "gid", "I"); 180b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusSizeFieldID = env->GetFieldID(fileStatusClass, "size", "J"); 181b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusBlksizeFieldID = env->GetFieldID(fileStatusClass, "blksize", "I"); 182b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusBlocksFieldID = env->GetFieldID(fileStatusClass, "blocks", "J"); 183b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusAtimeFieldID = env->GetFieldID(fileStatusClass, "atime", "J"); 184b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusMtimeFieldID = env->GetFieldID(fileStatusClass, "mtime", "J"); 185b16f769277e0d0998ffee71f33dfe0ddd4b0fd6eCarl Shapiro gFileStatusCtimeFieldID = env->GetFieldID(fileStatusClass, "ctime", "J"); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kFileUtilsPathName, 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project methods, NELEM(methods)); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 193