AndroidRuntime.h revision 3fbfbb4adeec1dda1e149758ea302c386101f267
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:
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
47a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath    void setArgv0(const char* argv0);
48a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a set of methods in the specified class.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int registerNativeMethods(JNIEnv* env,
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* className, const JNINativeMethod* gMethods, int numMethods);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call a class's static main method with the given arguments,
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5822ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath    status_t callMain(const String8& className, jclass clazz, const Vector<String8>& args);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
61a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes     * Find a class, with the input either of the form
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * "package/class" or "package.class".
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jclass findClass(JNIEnv* env, const char* className);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int addVmArguments(int argc, const char* const argv[]);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6822ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath    void start(const char *classname, const Vector<String8>& options);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
704280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    void exit(int code);
714280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown
724280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    void setExitWithoutCleanup(bool exitWithoutCleanup) {
734280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown        mExitWithoutCleanup = exitWithoutCleanup;
744280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    }
754280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static AndroidRuntime* getRuntime();
77a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
79d195e5ab401432ddac659791640a2927fc668699Elliott Hughes     * This gets called after the VM has been created, but before we
80d195e5ab401432ddac659791640a2927fc668699Elliott Hughes     * run any code. Override it to make any FindClass calls that need
81d195e5ab401432ddac659791640a2927fc668699Elliott Hughes     * to use CLASSPATH.
82d195e5ab401432ddac659791640a2927fc668699Elliott Hughes     */
83d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    virtual void onVmCreated(JNIEnv* env);
84d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
85d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    /**
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This gets called after the JavaVM has initialized.  Override it
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the system's native entry point.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void onStarted() = 0;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This gets called after the JavaVM has initialized after a Zygote
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fork. Override it to initialize threads, etc. Upon return, the
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * correct static main will be invoked.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
964280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    virtual void onZygoteInit() { }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
994280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown     * Called when the Java application exits to perform additional cleanup actions
1004280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown     * before the process is terminated.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1024280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    virtual void onExit(int code) { }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** create a new thread that is visible from Java */
105f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood    static android_thread_id_t createJavaThread(const char* name, void (*start)(void *),
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* arg);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** return a pointer to the VM running in this process */
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static JavaVM* getJavaVM() { return mJavaVM; }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** return a pointer to the JNIEnv pointer for this thread */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static JNIEnv* getJNIEnv();
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
114d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    /** return a new string corresponding to 'className' with all '.'s replaced by '/'s. */
115d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    static char* toSlashClassName(const char* className);
116d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int startReg(JNIEnv* env);
1196d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom    bool parseRuntimeOption(const char* property,
1206d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                            char* buffer,
1216d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                            const char* runtimeArg,
1226d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                            const char* defaultArg = "");
1233fbfbb4adeec1dda1e149758ea302c386101f267Brian Carlstrom    bool parseCompilerOption(const char* property,
1243fbfbb4adeec1dda1e149758ea302c386101f267Brian Carlstrom                             char* buffer,
1253fbfbb4adeec1dda1e149758ea302c386101f267Brian Carlstrom                             const char* compilerArg,
1263fbfbb4adeec1dda1e149758ea302c386101f267Brian Carlstrom                             const char* quotingArg);
1276d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom    bool parseCompilerRuntimeOption(const char* property,
1286d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                                    char* buffer,
1296d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                                    const char* runtimeArg,
1306d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom                                    const char* quotingArg);
1313beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom    void parseExtraOpts(char* extraOptsBuf, const char* quotingArg);
132f70188aa4716625781d9952c6b883180528d4644Andy McFadden    int startVm(JavaVM** pJavaVM, JNIEnv** pEnv);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<JavaVMOption> mOptions;
1354280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown    bool mExitWithoutCleanup;
136a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath    char* const mArgBlockStart;
137a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath    const size_t mArgBlockLength;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* JNI JavaVM pointer */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static JavaVM* mJavaVM;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Thread creation helpers.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int javaCreateThreadEtc(
146a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes                                android_thread_func_t entryFunction,
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                void* userData,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const char* threadName,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int32_t threadPriority,
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                size_t threadStackSize,
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                android_thread_id_t* threadId);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int javaThreadShell(void* args);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
158