1b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck/* 2b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * Copyright (C) 2016 The Android Open Source Project 3b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * 4b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * you may not use this file except in compliance with the License. 6b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * You may obtain a copy of the License at 7b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * 8b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * 10b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * Unless required by applicable law or agreed to in writing, software 11b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * See the License for the specific language governing permissions and 14b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck * limitations under the License. 15b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck */ 16b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 17b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck#include <jni.h> 18b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 19b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0]))) 20b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 21b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reckstatic void jintarrayArgumentNoop(JNIEnv*, jclass, jintArray, jint) { 22b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck} 23b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 24b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reckstatic jint jintarrayGetLength(JNIEnv* env, jclass, jintArray jarray) { 25b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck const jsize len = env->GetArrayLength(jarray); 26b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return static_cast<jint>(len); 27b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck} 28b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 29b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reckstatic jint jintarrayCriticalAccess(JNIEnv* env, jclass, jintArray jarray, jint index) { 30b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck const jsize len = env->GetArrayLength(jarray); 31b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck if (index < 0 || index >= len) { 32b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return -1; 33b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck } 34b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck jint* data = (jint*) env->GetPrimitiveArrayCritical(jarray, 0); 35b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck jint ret = data[index]; 36b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck env->ReleasePrimitiveArrayCritical(jarray, data, 0); 37b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return ret; 38b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck} 39b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 40b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reckstatic jint jintarrayBasicAccess(JNIEnv* env, jclass, jintArray jarray, jint index) { 41b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck const jsize len = env->GetArrayLength(jarray); 42b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck if (index < 0 || index >= len) { 43b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return -1; 44b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck } 45b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck jint* data = env->GetIntArrayElements(jarray, 0); 46b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck jint ret = data[index]; 47b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck env->ReleaseIntArrayElements(jarray, data, 0); 48b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return ret; 49b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck} 50b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 51b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reckstatic const JNINativeMethod sMethods[] = { 52b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck {"jintarrayArgumentNoop", "([II)V", (void *) jintarrayArgumentNoop}, 53b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck {"jintarrayGetLength", "([I)I", (void *) jintarrayGetLength}, 54b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck {"jintarrayCriticalAccess", "([II)I", (void *) jintarrayCriticalAccess}, 55b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck {"jintarrayBasicAccess", "([II)I", (void *) jintarrayBasicAccess}, 56b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck}; 57b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 58b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reckstatic int registerNativeMethods(JNIEnv* env, const char* className, 59b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck const JNINativeMethod* gMethods, int numMethods) { 60b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck jclass clazz = env->FindClass(className); 61b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck if (clazz == NULL) { 62b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return JNI_FALSE; 63b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck } 64b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { 65b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return JNI_FALSE; 66b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck } 67b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return JNI_TRUE; 68b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck} 69b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 70b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reckjint JNI_OnLoad(JavaVM* jvm, void*) { 71b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck JNIEnv *env = NULL; 72b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6)) { 73b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return JNI_ERR; 74b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck } 75b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 7652f6ba9a9da61c5839034a9cc25d98d6f460b31cColin Cross if (registerNativeMethods(env, "android/perftests/SystemPerfTest", 77b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck sMethods, NELEM(sMethods)) == -1) { 78b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return JNI_ERR; 79b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck } 80b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck 81b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck return JNI_VERSION_1_6; 82b2264c2bc5af19b53edc4708b5b86743f91ae8aaJohn Reck} 83