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