/
V8Runtime.java
162 lines (131 loc) Β· 4.14 KB
/
V8Runtime.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/**
* Appcelerator Titanium Mobile
* Copyright (c) 2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*/
package org.appcelerator.kroll.runtime.v8;
import java.util.ArrayList;
import java.util.HashMap;
import org.appcelerator.kroll.KrollExternalModule;
import org.appcelerator.kroll.KrollProxySupport;
import org.appcelerator.kroll.KrollRuntime;
import org.appcelerator.kroll.common.TiConfig;
import org.appcelerator.kroll.common.TiDeployData;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue.IdleHandler;
import android.util.Log;
public final class V8Runtime extends KrollRuntime implements Handler.Callback
{
private static final String TAG = "KrollV8Runtime";
private static final boolean DBG = TiConfig.LOGD;
private static final String NAME = "v8";
private static final int MSG_PROCESS_DEBUG_MESSAGES = KrollRuntime.MSG_LAST_ID + 100;
private boolean libLoaded = false;
private HashMap<String, Class<? extends KrollExternalModule>> externalModules = new HashMap<String, Class<? extends KrollExternalModule>>();
private ArrayList<String> loadedLibs = new ArrayList<String>();
@Override
public void initRuntime()
{
boolean useGlobalRefs = true;
TiDeployData deployData = getKrollApplication().getDeployData();
if (Build.PRODUCT.equals("sdk") || Build.PRODUCT.equals("google_sdk") || Build.FINGERPRINT.startsWith("generic")) {
if (DBG) {
Log.d(TAG, "Emulator detected, storing global references in a global Map");
}
useGlobalRefs = false;
}
if (!libLoaded) {
System.loadLibrary("stlport_shared");
System.loadLibrary("kroll-v8");
libLoaded = true;
}
boolean DBG = true;
String deployType = getKrollApplication().getDeployType();
if (deployType.equals("production")) {
DBG = false;
}
nativeInit(useGlobalRefs, deployData.getDebuggerPort(), DBG);
if (deployData.isDebuggerEnabled()) {
dispatchDebugMessages();
}
loadExternalModules();
Looper.myQueue().addIdleHandler(new IdleHandler() {
@Override
public boolean queueIdle()
{
nativeIdle();
return true;
}
});
}
private void loadExternalModules()
{
for (String libName : externalModules.keySet()) {
if (DBG) {
Log.d(TAG, "Bootstrapping module: " + libName);
}
if (!loadedLibs.contains(libName)) {
System.loadLibrary(libName);
loadedLibs.add(libName);
}
Class<? extends KrollExternalModule> moduleClass = externalModules.get(libName);
try {
KrollExternalModule module = moduleClass.newInstance();
module.bootstrap();
} catch (IllegalAccessException e) {
Log.e(TAG, "Error bootstrapping external module: " + e.getMessage(), e);
} catch (InstantiationException e) {
Log.e(TAG, "Error bootstrapping external module: " + e.getMessage(), e);
}
}
}
@Override
public void doDispose()
{
nativeDispose();
}
@Override
public void doRunModule(String source, String filename, KrollProxySupport activityProxy)
{
nativeRunModule(source, filename, activityProxy);
}
@Override
public void initObject(KrollProxySupport proxy)
{
V8Object.nativeInitObject(proxy.getClass(), proxy);
}
@Override
public boolean handleMessage(Message message)
{
switch (message.what) {
case MSG_PROCESS_DEBUG_MESSAGES:
nativeProcessDebugMessages();
dispatchDebugMessages();
return true;
}
return super.handleMessage(message);
}
@Override
public String getRuntimeName()
{
return NAME;
}
protected void dispatchDebugMessages()
{
handler.sendEmptyMessage(MSG_PROCESS_DEBUG_MESSAGES);
}
public void addExternalModule(String libName, Class<? extends KrollExternalModule> moduleClass)
{
externalModules.put(libName, moduleClass);
}
// JNI method prototypes
private native void nativeInit(boolean useGlobalRefs, int debuggerPort, boolean DBG);
private native void nativeRunModule(String source, String filename, KrollProxySupport activityProxy);
private native void nativeProcessDebugMessages();
private native void nativeIdle();
private native void nativeDispose();
}