libcore_io_Memory.cpp revision c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License. 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 175f327be03e6d79f9625585520c2c6117787204afAndy McFadden#define LOG_TAG "OSMemory" 18c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "JNIHelp.h" 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "utils/misc.h" 215f327be03e6d79f9625585520c2c6117787204afAndy McFadden#include "utils/Log.h" 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <sys/mman.h> 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <stdlib.h> 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <string.h> 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <errno.h> 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 275f327be03e6d79f9625585520c2c6117787204afAndy McFadden/* 285f327be03e6d79f9625585520c2c6117787204afAndy McFadden * Cached dalvik.system.VMRuntime pieces. 295f327be03e6d79f9625585520c2c6117787204afAndy McFadden */ 305f327be03e6d79f9625585520c2c6117787204afAndy McFaddenstatic struct { 315f327be03e6d79f9625585520c2c6117787204afAndy McFadden jmethodID method_trackExternalAllocation; 325f327be03e6d79f9625585520c2c6117787204afAndy McFadden jmethodID method_trackExternalFree; 335f327be03e6d79f9625585520c2c6117787204afAndy McFadden 345f327be03e6d79f9625585520c2c6117787204afAndy McFadden jobject runtimeInstance; 355f327be03e6d79f9625585520c2c6117787204afAndy McFadden} gIDCache; 365f327be03e6d79f9625585520c2c6117787204afAndy McFadden 373c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughesstatic const int MMAP_READ_ONLY = 1; 383c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughesstatic const int MMAP_READ_WRITE = 2; 393c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughesstatic const int MMAP_WRITE_COPY = 4; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: littleEndian 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: ()Z 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jboolean harmony_nio_littleEndian(JNIEnv *_env, jclass _this) { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long l = 0x01020304; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unsigned char* c = (unsigned char*)&l; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (*c == 0x04) ? JNI_TRUE : JNI_FALSE; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: getPointerSizeImpl 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: ()I 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jint harmony_nio_getPointerSizeImpl(JNIEnv *_env, jclass _this) { 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sizeof(void *); 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: mallocImpl 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I)I 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jint harmony_nio_mallocImpl(JNIEnv *_env, jobject _this, jint size) { 675f327be03e6d79f9625585520c2c6117787204afAndy McFadden jboolean allowed = _env->CallBooleanMethod(gIDCache.runtimeInstance, 685f327be03e6d79f9625585520c2c6117787204afAndy McFadden gIDCache.method_trackExternalAllocation, (jlong) size); 695f327be03e6d79f9625585520c2c6117787204afAndy McFadden if (!allowed) { 705f327be03e6d79f9625585520c2c6117787204afAndy McFadden LOGW("External allocation of %d bytes was rejected\n", size); 715f327be03e6d79f9625585520c2c6117787204afAndy McFadden jniThrowException(_env, "java/lang/OutOfMemoryError", NULL); 725f327be03e6d79f9625585520c2c6117787204afAndy McFadden return 0; 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 745f327be03e6d79f9625585520c2c6117787204afAndy McFadden 755f327be03e6d79f9625585520c2c6117787204afAndy McFadden LOGV("OSMemory alloc %d\n", size); 765f327be03e6d79f9625585520c2c6117787204afAndy McFadden void *returnValue = malloc(size + sizeof(jlong)); 775f327be03e6d79f9625585520c2c6117787204afAndy McFadden if (returnValue == NULL) { 785f327be03e6d79f9625585520c2c6117787204afAndy McFadden jniThrowException(_env, "java/lang/OutOfMemoryError", NULL); 795f327be03e6d79f9625585520c2c6117787204afAndy McFadden return 0; 805f327be03e6d79f9625585520c2c6117787204afAndy McFadden } 815f327be03e6d79f9625585520c2c6117787204afAndy McFadden 825f327be03e6d79f9625585520c2c6117787204afAndy McFadden /* 835f327be03e6d79f9625585520c2c6117787204afAndy McFadden * Tuck a copy of the size at the head of the buffer. We need this 845f327be03e6d79f9625585520c2c6117787204afAndy McFadden * so harmony_nio_freeImpl() knows how much memory is being freed. 855f327be03e6d79f9625585520c2c6117787204afAndy McFadden */ 865f327be03e6d79f9625585520c2c6117787204afAndy McFadden jlong* adjptr = (jlong*) returnValue; 875f327be03e6d79f9625585520c2c6117787204afAndy McFadden *adjptr++ = size; 885f327be03e6d79f9625585520c2c6117787204afAndy McFadden return (jint)adjptr; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: freeImpl 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I)V 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_freeImpl(JNIEnv *_env, jobject _this, jint pointer) { 975f327be03e6d79f9625585520c2c6117787204afAndy McFadden jlong* adjptr = (jlong*) pointer; 985f327be03e6d79f9625585520c2c6117787204afAndy McFadden jint size = *--adjptr; 995f327be03e6d79f9625585520c2c6117787204afAndy McFadden LOGV("OSMemory free %d\n", size); 1005f327be03e6d79f9625585520c2c6117787204afAndy McFadden _env->CallVoidMethod(gIDCache.runtimeInstance, 1015f327be03e6d79f9625585520c2c6117787204afAndy McFadden gIDCache.method_trackExternalFree, (jlong) size); 1025f327be03e6d79f9625585520c2c6117787204afAndy McFadden free((void *)adjptr); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: memset 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IBJ)V 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_memset(JNIEnv *_env, jobject _this, jint address, 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte value, jlong length) { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project memset ((void *) ((jint) address), (jbyte) value, (jlong) length); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: memmove 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IIJ)V 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_memmove(JNIEnv *_env, jobject _this, jint destAddress, 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint srcAddress, jlong length) { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project memmove ((void *) ((jint) destAddress), (const void *) ((jint) srcAddress), 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (jlong) length); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: getByteImpl 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I)B 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jbyte harmony_nio_getByteImpl(JNIEnv *_env, jobject _this, 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint pointer) { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte returnValue = *((jbyte *)pointer); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return returnValue; 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: getBytesImpl 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I[BII)V 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_getBytesImpl(JNIEnv *_env, jobject _this, jint pointer, 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyteArray dst, jint offset, jint length) { 144de2d83fd6a976a586e99d74018ac53fadc179aecElliott Hughes jbyte* src = reinterpret_cast<jbyte*>(static_cast<uintptr_t>(pointer)); 145de2d83fd6a976a586e99d74018ac53fadc179aecElliott Hughes _env->SetByteArrayRegion(dst, offset, length, src); 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: putByteImpl 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IB)V 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_putByteImpl(JNIEnv *_env, jobject _this, jint pointer, 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte val) { 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *((jbyte *)pointer) = val; 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: putBytesImpl 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I[BII)V 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_putBytesImpl(JNIEnv *_env, jobject _this, 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint pointer, jbyteArray src, jint offset, jint length) { 165de2d83fd6a976a586e99d74018ac53fadc179aecElliott Hughes jbyte* dst = reinterpret_cast<jbyte*>(static_cast<uintptr_t>(pointer)); 166de2d83fd6a976a586e99d74018ac53fadc179aecElliott Hughes _env->GetByteArrayRegion(src, offset, length, dst); 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void 170558383f61c19c594bdc475dc54216af6b12b142cElliott HughesswapShorts(jshort *shorts, int count) { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte *src = (jbyte *) shorts; 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte *dst = src; 173558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes for (int i = 0; i < count; ++i) { 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte b0 = *src++; 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte b1 = *src++; 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *dst++ = b1; 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *dst++ = b0; 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void 182558383f61c19c594bdc475dc54216af6b12b142cElliott HughesswapInts(jint *ints, int count) { 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte *src = (jbyte *) ints; 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte *dst = src; 185558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes for (int i = 0; i < count; ++i) { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte b0 = *src++; 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte b1 = *src++; 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte b2 = *src++; 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jbyte b3 = *src++; 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *dst++ = b3; 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *dst++ = b2; 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *dst++ = b1; 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *dst++ = b0; 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 199558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes * Method: setShortArrayImpl 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I[SIIZ)V 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 202558383f61c19c594bdc475dc54216af6b12b142cElliott Hughesstatic void harmony_nio_setShortArrayImpl(JNIEnv *_env, jobject _this, 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint pointer, jshortArray src, jint offset, jint length, jboolean swap) { 204558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes jshort* dst = reinterpret_cast<jshort*>(static_cast<uintptr_t>(pointer)); 205558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes _env->GetShortArrayRegion(src, offset, length, dst); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (swap) { 207558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes swapShorts(dst, length); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 213558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes * Method: setIntArrayImpl 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I[IIIZ)V 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 216558383f61c19c594bdc475dc54216af6b12b142cElliott Hughesstatic void harmony_nio_setIntArrayImpl(JNIEnv *_env, jobject _this, 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint pointer, jintArray src, jint offset, jint length, jboolean swap) { 218558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes jint* dst = reinterpret_cast<jint*>(static_cast<uintptr_t>(pointer)); 219558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes _env->GetIntArrayRegion(src, offset, length, dst); 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (swap) { 221558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes swapInts(dst, length); 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: getShortImpl 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I)S 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jshort harmony_nio_getShortImpl(JNIEnv *_env, jobject _this, 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint pointer) { 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x1) == 0) { 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jshort returnValue = *((jshort *)pointer); 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return returnValue; 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jshort s; 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unsigned char *src = (unsigned char *) pointer; 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unsigned char *dst = (unsigned char *) &s; 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[0] = src[0]; 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[1] = src[1]; 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s; 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: petShortImpl 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IS)V 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_putShortImpl(JNIEnv *_env, jobject _this, jint pointer, 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jshort value) { 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x1) == 0) { 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *((jshort *)pointer) = value; 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unsigned char *src = (unsigned char *) &value; 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unsigned char *dst = (unsigned char *) pointer; 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[0] = src[0]; 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[1] = src[1]; 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: getIntImpl 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I)I 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jint harmony_nio_getIntImpl(JNIEnv *_env, jobject _this, jint pointer) { 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x3) == 0) { 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint returnValue = *((jint *)pointer); 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return returnValue; 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint i; 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unsigned char *src = (unsigned char *) pointer; 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unsigned char *dst = (unsigned char *) &i; 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[0] = src[0]; 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[1] = src[1]; 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[2] = src[2]; 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[3] = src[3]; 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i; 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: putIntImpl 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (II)V 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_putIntImpl(JNIEnv *_env, jobject _this, jint pointer, 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint value) { 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x3) == 0) { 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *((jint *)pointer) = value; 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unsigned char *src = (unsigned char *) &value; 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unsigned char *dst = (unsigned char *) pointer; 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[0] = src[0]; 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[1] = src[1]; 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[2] = src[2]; 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project dst[3] = src[3]; 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: getLongImpl 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I)Ljava/lang/Long; 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jlong harmony_nio_getLongImpl(JNIEnv *_env, jobject _this, 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint pointer) { 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x7) == 0) { 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jlong returnValue = *((jlong *)pointer); 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return returnValue; 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jlong l; 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project memcpy((void *) &l, (void *) pointer, sizeof(jlong)); 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return l; 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: putLongImpl 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IJ)V 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_putLongImpl(JNIEnv *_env, jobject _this, jint pointer, 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jlong value) { 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x7) == 0) { 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *((jlong *)pointer) = value; 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project memcpy((void *) pointer, (void *) &value, sizeof(jlong)); 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: getFloatImpl 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I)F 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jfloat harmony_nio_getFloatImpl(JNIEnv *_env, jobject _this, 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint pointer) { 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x3) == 0) { 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jfloat returnValue = *((jfloat *)pointer); 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return returnValue; 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jfloat f; 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project memcpy((void *) &f, (void *) pointer, sizeof(jfloat)); 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return f; 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: setFloatImpl 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IF)V 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_putFloatImpl(JNIEnv *_env, jobject _this, jint pointer, 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jfloat value) { 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x3) == 0) { 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *((jfloat *)pointer) = value; 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project memcpy((void *) pointer, (void *) &value, sizeof(jfloat)); 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: getDoubleImpl 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I)D 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jdouble harmony_nio_getDoubleImpl(JNIEnv *_env, jobject _this, 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint pointer) { 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x7) == 0) { 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jdouble returnValue = *((jdouble *)pointer); 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return returnValue; 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jdouble d; 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project memcpy((void *) &d, (void *) pointer, sizeof(jdouble)); 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return d; 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: putDoubleImpl 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (ID)V 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_putDoubleImpl(JNIEnv *_env, jobject _this, jint pointer, 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jdouble value) { 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pointer & 0x7) == 0) { 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *((jdouble *)pointer) = value; 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle unaligned memory access one byte at a time 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project memcpy((void *) pointer, (void *) &value, sizeof(jdouble)); 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: getAddress 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (I)I 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jint harmony_nio_getAddress(JNIEnv *_env, jobject _this, jint pointer) { 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (jint) * (int *) pointer; 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: setAddress 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (II)V 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_setAddress(JNIEnv *_env, jobject _this, jint pointer, 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint value) { 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *(int *) pointer = (int) value; 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: mmapImpl 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IJJI)I 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 4293c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughesstatic jint harmony_nio_mmapImpl(JNIEnv* env, jobject, jint fd, 4303c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes jlong offset, jlong size, jint mapMode) { 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int prot, flags; 4323c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes switch (mapMode) { 4333c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes case MMAP_READ_ONLY: 4343c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes prot = PROT_READ; 4353c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes flags = MAP_SHARED; 4363c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes break; 4373c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes case MMAP_READ_WRITE: 4383c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes prot = PROT_READ|PROT_WRITE; 4393c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes flags = MAP_SHARED; 4403c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes break; 4413c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes case MMAP_WRITE_COPY: 4423c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes prot = PROT_READ|PROT_WRITE; 4433c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes flags = MAP_PRIVATE; 4443c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes break; 4453c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes default: 4463c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes jniThrowIOException(env, EINVAL); 4473c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes LOGE("bad mapMode %i", mapMode); 4483c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes return -1; 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4513c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes void* mapAddress = mmap(0, size, prot, flags, fd, offset); 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (mapAddress == MAP_FAILED) { 4533c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes jniThrowIOException(env, errno); 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 4553c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes return reinterpret_cast<uintptr_t>(mapAddress); 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: unmapImpl 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IJ)V 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic void harmony_nio_unmapImpl(JNIEnv *_env, jobject _this, jint address, 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jlong size) { 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project munmap((void *)address, (size_t)size); 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: loadImpl 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IJ)I 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jint harmony_nio_loadImpl(JNIEnv *_env, jobject _this, jint address, 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jlong size) { 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if(mlock((void *)address, (size_t)size)!=-1) { 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if(munlock((void *)address, (size_t)size)!=-1) { 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; /* normally */ 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* according to linux sys call, only root can mlock memory. */ 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if(errno == EPERM) { 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: isLoadedImpl 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IJ)Z 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jboolean harmony_nio_isLoadedImpl(JNIEnv *_env, jobject _this, 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint address, jlong size) { 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4993c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes static int page_size = getpagesize(); 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jboolean result = 0; 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jint m_addr = (jint)address; 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int align_offset = m_addr%page_size;// addr should align with the boundary of a page. 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project m_addr -= align_offset; 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project size += align_offset; 5063c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes int page_count = (size+page_size-1)/page_size; 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5083c6ff817ba94b64cf24014acff7201859410fb13Elliott Hughes unsigned char* vec = (unsigned char *) malloc(page_count*sizeof(char)); 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (mincore((void *)m_addr, size, (MINCORE_POINTER_TYPE) vec)==0) { 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // or else there is error about the mincore and return false; 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i; 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for(i=0 ;i<page_count;i++) { 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if(vec[i]!=1) { 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if(i==page_count) { 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = 1; 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project free(vec); 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class: org_apache_harmony_luni_platform_OSMemory 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Method: flushImpl 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Signature: (IJ)I 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic jint harmony_nio_flushImpl(JNIEnv *_env, jobject _this, jint address, 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jlong size) { 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return msync((void *)address, size, MS_SYNC); 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic JNINativeMethod gMethods[] = { 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "isLittleEndianImpl", "()Z", (void*) harmony_nio_littleEndian }, 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "getPointerSizeImpl", "()I", (void*) harmony_nio_getPointerSizeImpl }, 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "malloc", "(I)I", (void*) harmony_nio_mallocImpl }, 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "free", "(I)V", (void*) harmony_nio_freeImpl }, 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "memset", "(IBJ)V", (void*) harmony_nio_memset }, 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "memmove", "(IIJ)V", (void*) harmony_nio_memmove }, 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "getByteArray", "(I[BII)V",(void*) harmony_nio_getBytesImpl }, 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "setByteArray", "(I[BII)V",(void*) harmony_nio_putBytesImpl }, 547558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes { "setShortArray", "(I[SIIZ)V",(void*) harmony_nio_setShortArrayImpl }, 548558383f61c19c594bdc475dc54216af6b12b142cElliott Hughes { "setIntArray", "(I[IIIZ)V",(void*) harmony_nio_setIntArrayImpl }, 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "getByte", "(I)B", (void*) harmony_nio_getByteImpl }, 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "setByte", "(IB)V", (void*) harmony_nio_putByteImpl }, 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "getShort", "(I)S", (void*) harmony_nio_getShortImpl }, 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "setShort", "(IS)V", (void*) harmony_nio_putShortImpl }, 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "getInt", "(I)I", (void*) harmony_nio_getIntImpl }, 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "setInt", "(II)V", (void*) harmony_nio_putIntImpl }, 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "getLong", "(I)J", (void*) harmony_nio_getLongImpl }, 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "setLong", "(IJ)V", (void*) harmony_nio_putLongImpl }, 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "getFloat", "(I)F", (void*) harmony_nio_getFloatImpl }, 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "setFloat", "(IF)V", (void*) harmony_nio_putFloatImpl }, 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "getDouble", "(I)D", (void*) harmony_nio_getDoubleImpl }, 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "setDouble", "(ID)V", (void*) harmony_nio_putDoubleImpl }, 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "getAddress", "(I)I", (void*) harmony_nio_getAddress }, 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "setAddress", "(II)V", (void*) harmony_nio_setAddress }, 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "mmapImpl", "(IJJI)I", (void*) harmony_nio_mmapImpl }, 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "unmapImpl", "(IJ)V", (void*) harmony_nio_unmapImpl }, 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "loadImpl", "(IJ)I", (void*) harmony_nio_loadImpl }, 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "isLoadedImpl", "(IJ)Z", (void*) harmony_nio_isLoadedImpl }, 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { "flushImpl", "(IJ)I", (void*) harmony_nio_flushImpl } 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}; 569c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughesint register_org_apache_harmony_luni_platform_OSMemory(JNIEnv* env) { 5705f327be03e6d79f9625585520c2c6117787204afAndy McFadden /* 5715f327be03e6d79f9625585520c2c6117787204afAndy McFadden * We need to call VMRuntime.trackExternal{Allocation,Free}. Cache 5725f327be03e6d79f9625585520c2c6117787204afAndy McFadden * method IDs and a reference to the singleton. 5735f327be03e6d79f9625585520c2c6117787204afAndy McFadden */ 5745f327be03e6d79f9625585520c2c6117787204afAndy McFadden static const char* kVMRuntimeName = "dalvik/system/VMRuntime"; 5755f327be03e6d79f9625585520c2c6117787204afAndy McFadden jmethodID method_getRuntime; 5765f327be03e6d79f9625585520c2c6117787204afAndy McFadden jclass clazz; 5775f327be03e6d79f9625585520c2c6117787204afAndy McFadden 578c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes clazz = env->FindClass(kVMRuntimeName); 5795f327be03e6d79f9625585520c2c6117787204afAndy McFadden if (clazz == NULL) { 5805f327be03e6d79f9625585520c2c6117787204afAndy McFadden LOGE("Unable to find class %s\n", kVMRuntimeName); 5815f327be03e6d79f9625585520c2c6117787204afAndy McFadden return -1; 5825f327be03e6d79f9625585520c2c6117787204afAndy McFadden } 583c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes gIDCache.method_trackExternalAllocation = env->GetMethodID(clazz, 5845f327be03e6d79f9625585520c2c6117787204afAndy McFadden "trackExternalAllocation", "(J)Z"); 585c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes gIDCache.method_trackExternalFree = env->GetMethodID(clazz, 5865f327be03e6d79f9625585520c2c6117787204afAndy McFadden "trackExternalFree", "(J)V"); 587c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes method_getRuntime = env->GetStaticMethodID(clazz, 5885f327be03e6d79f9625585520c2c6117787204afAndy McFadden "getRuntime", "()Ldalvik/system/VMRuntime;"); 5895f327be03e6d79f9625585520c2c6117787204afAndy McFadden 5905f327be03e6d79f9625585520c2c6117787204afAndy McFadden if (gIDCache.method_trackExternalAllocation == NULL || 5915f327be03e6d79f9625585520c2c6117787204afAndy McFadden gIDCache.method_trackExternalFree == NULL || 5925f327be03e6d79f9625585520c2c6117787204afAndy McFadden method_getRuntime == NULL) 5935f327be03e6d79f9625585520c2c6117787204afAndy McFadden { 5945f327be03e6d79f9625585520c2c6117787204afAndy McFadden LOGE("Unable to find VMRuntime methods\n"); 5955f327be03e6d79f9625585520c2c6117787204afAndy McFadden return -1; 5965f327be03e6d79f9625585520c2c6117787204afAndy McFadden } 5975f327be03e6d79f9625585520c2c6117787204afAndy McFadden 598c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes jobject instance = env->CallStaticObjectMethod(clazz, method_getRuntime); 5995f327be03e6d79f9625585520c2c6117787204afAndy McFadden if (instance == NULL) { 6005f327be03e6d79f9625585520c2c6117787204afAndy McFadden LOGE("Unable to obtain VMRuntime instance\n"); 6015f327be03e6d79f9625585520c2c6117787204afAndy McFadden return -1; 6025f327be03e6d79f9625585520c2c6117787204afAndy McFadden } 603c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes gIDCache.runtimeInstance = env->NewGlobalRef(instance); 6045f327be03e6d79f9625585520c2c6117787204afAndy McFadden 605c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes return jniRegisterNativeMethods(env, "org/apache/harmony/luni/platform/OSMemory", 606c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes gMethods, NELEM(gMethods)); 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 608