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>
29889f9952d8aa438d5aef6fea9046eddb38ea11b0Steven Moreland#include <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:
37a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath    AndroidRuntime(char* argBlockStart, size_t argBlockSize);
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
47f5b6e5590e0a2c1be10bc0bd0a3b141256fdf7fdDmitriy Filchenko    void setArgv0(const char* argv0, bool setProcName = false);
4800c0cd4a24bd0f040055f9e786e2df1fa3b7d2d3Jeff Brown    void addOption(const char* optionString, void* extra_info = NULL);
49a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a set of methods in the specified class.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int registerNativeMethods(JNIEnv* env,
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* className, const JNINativeMethod* gMethods, int numMethods);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call a class's static main method with the given arguments,
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5922ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath    status_t callMain(const String8& className, jclass clazz, const Vector<String8>& args);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
62a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes     * Find a class, with the input either of the form
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * "package/class" or "package.class".
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jclass findClass(JNIEnv* env, const char* className);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
677a09b8322cab26d6e3da1362d3c74964ae66b5d4Sebastien Hertz    void start(const char *classname, const Vector<String8>& options, bool zygote);
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     */
10171044fe7e5594f329f19b1a5e7f1ce2da6562082Colin Cross    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
1169ee5e7e17f7d65620f21d1a42865981e7bc56593Mike Lockwood    /** Create a Java string from an ASCII or Latin-1 string */
1179ee5e7e17f7d65620f21d1a42865981e7bc56593Mike Lockwood    static jstring NewStringLatin1(JNIEnv* env, const char* bytes);
1189ee5e7e17f7d65620f21d1a42865981e7bc56593Mike Lockwood
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int startReg(JNIEnv* env);
1216d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom    bool parseRuntimeOption(const char* property,
1226d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                            char* buffer,
1236d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                            const char* runtimeArg,
1246d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                            const char* defaultArg = "");
1253fbfbb4adeec1dda1e149758ea302c386101f267Brian Carlstrom    bool parseCompilerOption(const char* property,
1263fbfbb4adeec1dda1e149758ea302c386101f267Brian Carlstrom                             char* buffer,
1273fbfbb4adeec1dda1e149758ea302c386101f267Brian Carlstrom                             const char* compilerArg,
1283fbfbb4adeec1dda1e149758ea302c386101f267Brian Carlstrom                             const char* quotingArg);
1296d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom    bool parseCompilerRuntimeOption(const char* property,
1306d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                                    char* buffer,
1316d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                                    const char* runtimeArg,
1326d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                                    const char* quotingArg);
1333beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom    void parseExtraOpts(char* extraOptsBuf, const char* quotingArg);
1347a09b8322cab26d6e3da1362d3c74964ae66b5d4Sebastien Hertz    int startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<JavaVMOption> mOptions;
1374280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    bool mExitWithoutCleanup;
138a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath    char* const mArgBlockStart;
139a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath    const size_t mArgBlockLength;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* JNI JavaVM pointer */
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static JavaVM* mJavaVM;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Thread creation helpers.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int javaCreateThreadEtc(
148a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes                                android_thread_func_t entryFunction,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                void* userData,
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const char* threadName,
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int32_t threadPriority,
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                size_t threadStackSize,
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                android_thread_id_t* threadId);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int javaThreadShell(void* args);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
160