193d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian/*
293d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian * Copyright (C) 2011 The Android Open Source Project
393d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian *
493d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
593d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian * you may not use this file except in compliance with the License.
693d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian * You may obtain a copy of the License at
793d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian *
893d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
993d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian *
1093d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian * Unless required by applicable law or agreed to in writing, software
1193d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
1293d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1393d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian * See the License for the specific language governing permissions and
1493d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian * limitations under the License.
1593d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian */
1693d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
1793d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian#include <android_runtime/AndroidRuntime.h>
1893d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
1993d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian#include "jni.h"
2093d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian#include "DdmConnection.h"
2193d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
2293d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopianextern "C" jint Java_com_android_internal_util_WithFramework_registerNatives(
2393d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian        JNIEnv* env, jclass clazz);
2493d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
2593d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopiannamespace android {
2693d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
2793d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopianvoid DdmConnection::start(const char* name) {
2893d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    JavaVM* vm;
2993d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    JNIEnv* env;
3093d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
3193d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    // start a VM
3293d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    JavaVMInitArgs args;
3393d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    JavaVMOption opt;
3493d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
3593d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    opt.optionString =
3693d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian        "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";
3793d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
3893d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    args.version = JNI_VERSION_1_4;
3993d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    args.options = &opt;
4093d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    args.nOptions = 1;
4193d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    args.ignoreUnrecognized = JNI_FALSE;
4293d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
4393d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    if (JNI_CreateJavaVM(&vm, &env, &args) == 0) {
4493d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian        jclass startClass;
4593d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian        jmethodID startMeth;
4693d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
4793d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian        // register native code
4893d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian        if (Java_com_android_internal_util_WithFramework_registerNatives(env, 0) == 0) {
4993d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian            // set our name by calling DdmHandleAppName.setAppName()
5093d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian            startClass = env->FindClass("android/ddm/DdmHandleAppName");
5193d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian            if (startClass) {
5293d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                startMeth = env->GetStaticMethodID(startClass,
5393d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                        "setAppName", "(Ljava/lang/String;)V");
5493d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                if (startMeth) {
5593d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                    jstring str = env->NewStringUTF(name);
5693d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                    env->CallStaticVoidMethod(startClass, startMeth, str);
5793d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                    env->DeleteLocalRef(str);
5893d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                }
5993d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian            }
6093d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
6193d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian            // initialize DDMS communication by calling
6293d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian            // DdmRegister.registerHandlers()
6393d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian            startClass = env->FindClass("android/ddm/DdmRegister");
6493d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian            if (startClass) {
6593d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                startMeth = env->GetStaticMethodID(startClass,
6693d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                        "registerHandlers", "()V");
6793d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                if (startMeth) {
6893d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                    env->CallStaticVoidMethod(startClass, startMeth);
6993d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian                }
7093d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian            }
7193d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian        }
7293d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian    }
7393d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian}
7493d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian
7593d75ec3714d829a41947a29b5c4028b282622c4Mathias Agopian}; // namespace android
76