19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef _RUNTIME_ANDROID_RUNTIME_H
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define _RUNTIME_ANDROID_RUNTIME_H
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h>
230795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IBinder.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String8.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String16.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pthread.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <nativehelper/jni.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
3381ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AndroidRuntime
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AndroidRuntime();
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~AndroidRuntime();
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    enum StartMode {
41ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        Zygote,
42ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        SystemServer,
43ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        Application,
44ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        Tool,
45ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    };
46ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a set of methods in the specified class.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int registerNativeMethods(JNIEnv* env,
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* className, const JNINativeMethod* gMethods, int numMethods);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call a class's static main method with the given arguments,
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    status_t callMain(const char* className, jclass clazz, int argc,
57d195e5ab401432ddac659791640a2927fc668699Elliott Hughes        const char* const argv[]);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
60a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes     * Find a class, with the input either of the form
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * "package/class" or "package.class".
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jclass findClass(JNIEnv* env, const char* className);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int addVmArguments(int argc, const char* const argv[]);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    void start(const char *classname, const char* options);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
694280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    void exit(int code);
704280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown
714280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    void setExitWithoutCleanup(bool exitWithoutCleanup) {
724280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown        mExitWithoutCleanup = exitWithoutCleanup;
734280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    }
744280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static AndroidRuntime* getRuntime();
76a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
78d195e5ab401432ddac659791640a2927fc668699Elliott Hughes     * This gets called after the VM has been created, but before we
79d195e5ab401432ddac659791640a2927fc668699Elliott Hughes     * run any code. Override it to make any FindClass calls that need
80d195e5ab401432ddac659791640a2927fc668699Elliott Hughes     * to use CLASSPATH.
81d195e5ab401432ddac659791640a2927fc668699Elliott Hughes     */
82d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    virtual void onVmCreated(JNIEnv* env);
83d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
84d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This gets called after the JavaVM has initialized.  Override it
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the system's native entry point.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void onStarted() = 0;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This gets called after the JavaVM has initialized after a Zygote
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fork. Override it to initialize threads, etc. Upon return, the
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * correct static main will be invoked.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
954280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    virtual void onZygoteInit() { }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
984280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown     * Called when the Java application exits to perform additional cleanup actions
994280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown     * before the process is terminated.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1014280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    virtual void onExit(int code) { }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** create a new thread that is visible from Java */
104f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood    static android_thread_id_t createJavaThread(const char* name, void (*start)(void *),
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* arg);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** return a pointer to the VM running in this process */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static JavaVM* getJavaVM() { return mJavaVM; }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** return a pointer to the JNIEnv pointer for this thread */
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static JNIEnv* getJNIEnv();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
113d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    /** return a new string corresponding to 'className' with all '.'s replaced by '/'s. */
114d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    static char* toSlashClassName(const char* className);
115d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int startReg(JNIEnv* env);
118e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden    void parseExtraOpts(char* extraOptsBuf);
119f70188aa4716625781d9952c6b883180528d4644Andy McFadden    int startVm(JavaVM** pJavaVM, JNIEnv** pEnv);
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<JavaVMOption> mOptions;
1224280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    bool mExitWithoutCleanup;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* JNI JavaVM pointer */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static JavaVM* mJavaVM;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Thread creation helpers.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int javaCreateThreadEtc(
131a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes                                android_thread_func_t entryFunction,
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                void* userData,
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const char* threadName,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int32_t threadPriority,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                size_t threadStackSize,
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                android_thread_id_t* threadId);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int javaThreadShell(void* args);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
143