java_lang_reflect_Proxy.cc revision 95caa791e560da97363c0c0d22bfda4a7e7377c3
195caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson/*
295caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson * Copyright (C) 2008 The Android Open Source Project
395caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson *
495caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson * you may not use this file except in compliance with the License.
695caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson * You may obtain a copy of the License at
795caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson *
895caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
995caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson *
1095caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson * Unless required by applicable law or agreed to in writing, software
1195caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
1295caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1395caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson * See the License for the specific language governing permissions and
1495caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson * limitations under the License.
1595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson */
1695caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
1795caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson#include "jni_internal.h"
1895caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson#include "object.h"
1995caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson#include "class_linker.h"
2095caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
2195caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson#include "JniConstants.h" // Last to avoid problems with LOG redefinition.
2295caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
2395caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilsonnamespace art {
2495caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
2595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilsonnamespace {
2695caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
2795caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilsonstatic jclass Proxy_generateProxy(JNIEnv* env, jclass, jstring javaName, jobjectArray javaInterfaces, jobject javaLoader, jobjectArray javaMethods, jobjectArray javaThrows) {
2895caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  String* name = Decode<String*>(env, javaName);
2995caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  ObjectArray<Class>* interfaces = Decode<ObjectArray<Class>*>(env, javaInterfaces);
3095caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  ClassLoader* loader = Decode<ClassLoader*>(env, javaLoader);
3195caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  ObjectArray<Method>* methods = Decode<ObjectArray<Method>*>(env, javaMethods);
3295caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  ObjectArray<Object>* throws = Decode<ObjectArray<Object>*>(env, javaThrows);
3395caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
3495caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  Class* result = class_linker->CreateProxyClass(name, interfaces, loader, methods, throws);
3595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  return AddLocalReference<jclass>(env, result);
3695caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson}
3795caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
3895caa791e560da97363c0c0d22bfda4a7e7377c3Jesse WilsonJNINativeMethod gMethods[] = {
3995caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  NATIVE_METHOD(Proxy, generateProxy, "(Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/ClassLoader;[Ljava/lang/reflect/Method;[[Ljava/lang/Class;)Ljava/lang/Class;"),
4095caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson};
4195caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
4295caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson}  // namespace
4395caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
4495caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilsonvoid register_java_lang_reflect_Proxy(JNIEnv* env) {
4595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  jniRegisterNativeMethods(env, "java/lang/reflect/Proxy", gMethods, NELEM(gMethods));
4695caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson}
4795caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
4895caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson}  // namespace art
49