blob: e23b16214ae031806b08b3a93d975fbc3e56c799 [file] [log] [blame]
Ian Rogersdf20fe02011-07-20 20:34:16 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07003#include "jni_internal.h"
Carl Shapiro2ed144c2011-07-26 16:52:08 -07004
Carl Shapiro9b9ba282011-08-14 15:30:39 -07005#include <cstdarg>
Carl Shapiro2ed144c2011-07-26 16:52:08 -07006#include <vector>
7#include <utility>
Carl Shapiro9b9ba282011-08-14 15:30:39 -07008#include <sys/mman.h>
Carl Shapiro2ed144c2011-07-26 16:52:08 -07009
Elliott Hughes40ef99e2011-08-11 17:44:34 -070010#include "class_linker.h"
Carl Shapiroea4dca82011-08-01 13:45:38 -070011#include "jni.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070012#include "logging.h"
Carl Shapiro9b9ba282011-08-14 15:30:39 -070013#include "object.h"
Carl Shapiro2ed144c2011-07-26 16:52:08 -070014#include "runtime.h"
Carl Shapirofc322c72011-07-27 00:20:01 -070015#include "scoped_ptr.h"
16#include "stringpiece.h"
Carl Shapiro2ed144c2011-07-26 16:52:08 -070017#include "thread.h"
Ian Rogersdf20fe02011-07-20 20:34:16 -070018
19namespace art {
20
Elliott Hughes22f40932011-08-12 13:06:37 -070021// Entry/exit processing for all JNI calls.
22//
23// This performs the necessary thread state switching, lets us amortize the
24// cost of working out the current thread, and lets us check (and repair) apps
25// that are using a JNIEnv on the wrong thread.
26class ScopedJniThreadState {
27 public:
28 explicit ScopedJniThreadState(JNIEnv* env) {
Elliott Hughesb20a5542011-08-12 18:03:12 -070029 self_ = ThreadForEnv(env);
Elliott Hughes22f40932011-08-12 13:06:37 -070030 self_->SetState(Thread::kRunnable);
31 }
32
33 ~ScopedJniThreadState() {
34 self_->SetState(Thread::kNative);
35 }
36
Elliott Hughesb20a5542011-08-12 18:03:12 -070037 Thread* Self() {
Elliott Hughes22f40932011-08-12 13:06:37 -070038 return self_;
39 }
40
Elliott Hughesb20a5542011-08-12 18:03:12 -070041 private:
42 static Thread* ThreadForEnv(JNIEnv* env) {
Elliott Hughes22f40932011-08-12 13:06:37 -070043 // TODO: need replacement for gDvmJni.
44 bool workAroundAppJniBugs = true;
45 Thread* env_self = reinterpret_cast<JNIEnvExt*>(env)->self;
46 Thread* self = workAroundAppJniBugs ? Thread::Current() : env_self;
47 if (self != env_self) {
Elliott Hughes330304d2011-08-12 14:28:05 -070048 LOG(ERROR) << "JNI ERROR: JNIEnv for " << *env_self
49 << " used on " << *self;
50 // TODO: dump stack
Elliott Hughes22f40932011-08-12 13:06:37 -070051 }
52 return self;
53 }
54
Elliott Hughes22f40932011-08-12 13:06:37 -070055 Thread* self_;
56 DISALLOW_COPY_AND_ASSIGN(ScopedJniThreadState);
57};
58
Elliott Hughes8a26c5c2011-08-15 18:35:43 -070059template<typename T>
60T AddLocalReference(ScopedJniThreadState& ts, Object* obj) {
61 UNIMPLEMENTED(WARNING);
62 return reinterpret_cast<T>(obj);
63}
64
Carl Shapiro9b9ba282011-08-14 15:30:39 -070065void CreateInvokeStub(Assembler* assembler, Method* method);
66
67bool EnsureInvokeStub(Method* method) {
68 if (method->GetInvokeStub() != NULL) {
69 return true;
70 }
71 // TODO: use signature to find a matching stub
72 // TODO: failed, acquire a lock on the stub table
73 Assembler assembler;
74 CreateInvokeStub(&assembler, method);
75 // TODO: store native_entry in the stub table
76 int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
77 size_t length = assembler.CodeSize();
78 void* addr = mmap(NULL, length, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
79 if (addr == MAP_FAILED) {
80 PLOG(FATAL) << "mmap failed";
81 }
82 MemoryRegion region(addr, length);
83 assembler.FinalizeInstructions(region);
84 method->SetInvokeStub(reinterpret_cast<Method::InvokeStub*>(region.pointer()));
85 return true;
86}
87
Elliott Hughesd8ddfd52011-08-15 14:32:53 -070088byte* CreateArgArray(Method* method, va_list ap) {
Carl Shapiro9b9ba282011-08-14 15:30:39 -070089 size_t num_bytes = method->NumArgArrayBytes();
90 scoped_array<byte> arg_array(new byte[num_bytes]);
91 const StringPiece& shorty = method->GetShorty();
Ian Rogers4dd71f12011-08-16 14:16:02 -070092 for (int i = 1, offset = 0; i < shorty.size(); ++i) {
Carl Shapiro9b9ba282011-08-14 15:30:39 -070093 switch (shorty[i]) {
94 case 'Z':
95 case 'B':
96 case 'C':
97 case 'S':
98 case 'I':
99 *reinterpret_cast<int32_t*>(&arg_array[offset]) = va_arg(ap, jint);
100 offset += 4;
101 break;
102 case 'F':
103 *reinterpret_cast<float*>(&arg_array[offset]) = va_arg(ap, jdouble);
104 offset += 4;
105 break;
106 case 'L': {
Elliott Hughesf2682d52011-08-15 16:37:04 -0700107 // TODO: DecodeReference
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700108 Object* obj = reinterpret_cast<Object*>(va_arg(ap, jobject));
109 *reinterpret_cast<Object**>(&arg_array[offset]) = obj;
110 offset += sizeof(Object*);
111 break;
112 }
113 case 'D':
114 *reinterpret_cast<double*>(&arg_array[offset]) = va_arg(ap, jdouble);
115 offset += 8;
116 break;
117 case 'J':
118 *reinterpret_cast<int64_t*>(&arg_array[offset]) = va_arg(ap, jlong);
119 offset += 8;
120 break;
121 }
122 }
123 return arg_array.release();
124}
125
Elliott Hughesd8ddfd52011-08-15 14:32:53 -0700126byte* CreateArgArray(Method* method, jvalue* args) {
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700127 size_t num_bytes = method->NumArgArrayBytes();
128 scoped_array<byte> arg_array(new byte[num_bytes]);
129 const StringPiece& shorty = method->GetShorty();
Ian Rogers4dd71f12011-08-16 14:16:02 -0700130 for (int i = 1, offset = 0; i < shorty.size(); ++i) {
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700131 switch (shorty[i]) {
132 case 'Z':
133 case 'B':
134 case 'C':
135 case 'S':
136 case 'I':
137 *reinterpret_cast<uint32_t*>(&arg_array[offset]) = args[i - 1].i;
138 offset += 4;
139 break;
140 case 'F':
141 *reinterpret_cast<float*>(&arg_array[offset]) = args[i - 1].f;
142 offset += 4;
143 break;
144 case 'L': {
Elliott Hughesf2682d52011-08-15 16:37:04 -0700145 // TODO: DecodeReference
146 Object* obj = reinterpret_cast<Object*>(args[i - 1].l);
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700147 *reinterpret_cast<Object**>(&arg_array[offset]) = obj;
148 offset += sizeof(Object*);
149 break;
150 }
151 case 'D':
152 *reinterpret_cast<double*>(&arg_array[offset]) = args[i - 1].d;
153 offset += 8;
154 break;
155 case 'J':
156 *reinterpret_cast<uint64_t*>(&arg_array[offset]) = args[i - 1].j;
157 offset += 8;
158 break;
159 }
160 }
161 return arg_array.release();
162}
163
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700164JValue InvokeWithArgArray(Thread* self, Object* obj, jmethodID method_id,
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700165 byte* args) {
Elliott Hughesf2682d52011-08-15 16:37:04 -0700166 // TODO: DecodeReference
167 Method* method = reinterpret_cast<Method*>(method_id);
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700168 // Call the invoke stub associated with the method
169 // Pass everything as arguments
170 const Method::InvokeStub* stub = method->GetInvokeStub();
171 CHECK(stub != NULL);
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700172 JValue result;
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700173 (*stub)(method, obj, self, args, &result);
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700174 return result;
175}
176
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700177JValue InvokeWithJValues(Thread* self, Object* obj, jmethodID method_id,
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700178 jvalue* args) {
179 Method* method = reinterpret_cast<Method*>(method_id);
180 scoped_array<byte> arg_array(CreateArgArray(method, args));
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700181 return InvokeWithArgArray(self, obj, method_id, arg_array.get());
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700182}
183
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700184JValue InvokeWithVarArgs(Thread* self, Object* obj, jmethodID method_id,
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700185 va_list args) {
186 Method* method = reinterpret_cast<Method*>(method_id);
187 scoped_array<byte> arg_array(CreateArgArray(method, args));
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700188 return InvokeWithArgArray(self, obj, method_id, arg_array.get());
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700189}
190
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700191jint GetVersion(JNIEnv* env) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700192 ScopedJniThreadState ts(env);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700193 return JNI_VERSION_1_6;
194}
195
Elliott Hughesb20a5542011-08-12 18:03:12 -0700196jclass DefineClass(JNIEnv* env, const char*, jobject, const jbyte*, jsize) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700197 ScopedJniThreadState ts(env);
Elliott Hughesb20a5542011-08-12 18:03:12 -0700198 LOG(WARNING) << "JNI DefineClass is not supported";
Carl Shapiroea4dca82011-08-01 13:45:38 -0700199 return NULL;
200}
201
Elliott Hughes6b436852011-08-12 10:16:44 -0700202// Section 12.3.2 of the JNI spec describes JNI class descriptors. They're
203// separated with slashes but aren't wrapped with "L;" like regular descriptors
204// (i.e. "a/b/C" rather than "La/b/C;"). Arrays of reference types are an
205// exception; there the "L;" must be present ("[La/b/C;"). Historically we've
206// supported names with dots too (such as "a.b.C").
207std::string NormalizeJniClassDescriptor(const char* name) {
208 std::string result;
209 // Add the missing "L;" if necessary.
210 if (name[0] == '[') {
211 result = name;
212 } else {
213 result += 'L';
214 result += name;
215 result += ';';
216 }
217 // Rewrite '.' as '/' for backwards compatibility.
Elliott Hughesa5b897e2011-08-16 11:33:06 -0700218 if (result.find('.') != std::string::npos) {
219 LOG(WARNING) << "Call to JNI FindClass with dots in name: "
220 << "\"" << name << "\"";
221 std::replace(result.begin(), result.end(), '.', '/');
Elliott Hughes6b436852011-08-12 10:16:44 -0700222 }
223 return result;
224}
225
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700226jclass FindClass(JNIEnv* env, const char* name) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700227 ScopedJniThreadState ts(env);
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700228 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
Elliott Hughes6b436852011-08-12 10:16:44 -0700229 std::string descriptor(NormalizeJniClassDescriptor(name));
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700230 // TODO: need to get the appropriate ClassLoader.
Elliott Hughes6b436852011-08-12 10:16:44 -0700231 Class* c = class_linker->FindClass(descriptor, NULL);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -0700232 return AddLocalReference<jclass>(ts, c);
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700233}
234
235jmethodID FromReflectedMethod(JNIEnv* env, jobject method) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700236 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700237 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700238 return NULL;
239}
240
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700241jfieldID FromReflectedField(JNIEnv* env, jobject field) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700242 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700243 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700244 return NULL;
245}
246
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700247jobject ToReflectedMethod(JNIEnv* env, jclass cls,
248 jmethodID methodID, jboolean isStatic) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700249 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700250 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700251 return NULL;
252}
253
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700254jclass GetSuperclass(JNIEnv* env, jclass sub) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700255 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700256 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700257 return NULL;
258}
259
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700260jboolean IsAssignableFrom(JNIEnv* env, jclass sub, jclass sup) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700261 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700262 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700263 return JNI_FALSE;
264}
265
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700266jobject ToReflectedField(JNIEnv* env, jclass cls,
267 jfieldID fieldID, jboolean isStatic) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700268 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700269 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700270 return NULL;
271}
272
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700273jint Throw(JNIEnv* env, jthrowable obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700274 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700275 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700276 return 0;
277}
278
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700279jint ThrowNew(JNIEnv* env, jclass clazz, const char* msg) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700280 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700281 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700282 return 0;
283}
284
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700285jthrowable ExceptionOccurred(JNIEnv* env) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700286 ScopedJniThreadState ts(env);
Ian Rogers4dd71f12011-08-16 14:16:02 -0700287 Object* exception = ts.Self()->GetException();
288 if (exception == NULL) {
289 return NULL;
290 } else {
291 // TODO: if adding a local reference failing causes the VM to abort
292 // then the following check will never occur.
293 jthrowable localException = AddLocalReference<jthrowable>(ts, exception);
294 if (localException == NULL) {
295 // We were unable to add a new local reference, and threw a new
296 // exception. We can't return "exception", because it's not a
297 // local reference. So we have to return NULL, indicating that
298 // there was no exception, even though it's pretty much raining
299 // exceptions in here.
300 LOG(WARNING) << "JNI WARNING: addLocal/exception combo";
301 }
302 return localException;
303 }
Carl Shapiroea4dca82011-08-01 13:45:38 -0700304}
305
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700306void ExceptionDescribe(JNIEnv* env) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700307 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700308 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700309}
310
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700311void ExceptionClear(JNIEnv* env) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700312 ScopedJniThreadState ts(env);
Elliott Hughesb20a5542011-08-12 18:03:12 -0700313 ts.Self()->ClearException();
Carl Shapiroea4dca82011-08-01 13:45:38 -0700314}
315
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700316void FatalError(JNIEnv* env, const char* msg) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700317 ScopedJniThreadState ts(env);
Elliott Hughesb20a5542011-08-12 18:03:12 -0700318 LOG(FATAL) << "JNI FatalError called: " << msg;
Carl Shapiroea4dca82011-08-01 13:45:38 -0700319}
320
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700321jint PushLocalFrame(JNIEnv* env, jint cap) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700322 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700323 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700324 return 0;
325}
326
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700327jobject PopLocalFrame(JNIEnv* env, jobject res) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700328 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700329 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700330 return NULL;
331}
332
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700333jobject NewGlobalRef(JNIEnv* env, jobject lobj) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700334 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700335 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700336 return NULL;
337}
338
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700339void DeleteGlobalRef(JNIEnv* env, jobject gref) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700340 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700341 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700342}
343
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700344void DeleteLocalRef(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700345 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -0700346 UNIMPLEMENTED(WARNING);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700347}
348
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700349jboolean IsSameObject(JNIEnv* env, jobject obj1, jobject obj2) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700350 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700351 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700352 return JNI_FALSE;
353}
354
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700355jobject NewLocalRef(JNIEnv* env, jobject ref) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700356 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700357 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700358 return NULL;
359}
360
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700361jint EnsureLocalCapacity(JNIEnv* env, jint) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700362 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700363 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700364 return 0;
365}
366
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700367jobject AllocObject(JNIEnv* env, jclass clazz) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700368 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700369 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700370 return NULL;
371}
372
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700373jobject NewObject(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700374 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700375 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700376 return NULL;
377}
378
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700379jobject NewObjectV(JNIEnv* env,
380 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700381 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700382 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700383 return NULL;
384}
385
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700386jobject NewObjectA(JNIEnv* env,
387 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700388 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700389 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700390 return NULL;
391}
392
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700393jclass GetObjectClass(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700394 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700395 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700396 return NULL;
397}
398
Ian Rogers4dd71f12011-08-16 14:16:02 -0700399jboolean IsInstanceOf(JNIEnv* env, jobject jobj, jclass clazz) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700400 ScopedJniThreadState ts(env);
Ian Rogers4dd71f12011-08-16 14:16:02 -0700401 CHECK_NE(static_cast<jclass>(NULL), clazz);
402 if (jobj == NULL) {
403 // NB. JNI is different from regular Java instanceof in this respect
404 return JNI_TRUE;
405 } else {
406 // TODO: retrieve handle value for object
407 Object* obj = reinterpret_cast<Object*>(jobj);
408 // TODO: retrieve handle value for class
409 Class* klass = reinterpret_cast<Class*>(clazz);
410 return Object::InstanceOf(obj, klass) ? JNI_TRUE : JNI_FALSE;
411 }
Carl Shapiroea4dca82011-08-01 13:45:38 -0700412}
413
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700414jmethodID GetMethodID(JNIEnv* env,
415 jclass clazz, const char* name, const char* sig) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700416 ScopedJniThreadState ts(env);
Carl Shapiro83ab4f32011-08-15 20:21:39 -0700417 // TODO: retrieve handle value for class
418 Class* klass = reinterpret_cast<Class*>(clazz);
419 if (!klass->IsInitialized()) {
420 // TODO: initialize the class
421 }
422 Method* method = klass->FindVirtualMethod(name, sig);
423 if (method == NULL) {
424 // No virtual method matching the signature. Search declared
425 // private methods and constructors.
426 method = klass->FindDeclaredDirectMethod(name, sig);
427 }
Ian Rogers4dd71f12011-08-16 14:16:02 -0700428 if (method == NULL) {
429 Thread* self = Thread::Current();
430 std::string class_name = klass->GetDescriptor().ToString();
431 // TODO: pretty print method names through a single routine
432 self->ThrowNewException("Ljava/lang/NoSuchMethodError;",
433 "no method \"%s.%s%s\"",
434 class_name.c_str(), name, sig);
Carl Shapiro83ab4f32011-08-15 20:21:39 -0700435 return NULL;
Ian Rogers4dd71f12011-08-16 14:16:02 -0700436 } else if (method->IsStatic()) {
437 Thread* self = Thread::Current();
438 std::string class_name = klass->GetDescriptor().ToString();
439 // TODO: pretty print method names through a single routine
440 self->ThrowNewException("Ljava/lang/NoSuchMethodError;",
441 "method \"%s.%s%s\" is static",
442 class_name.c_str(), name, sig);
Carl Shapiro83ab4f32011-08-15 20:21:39 -0700443 return NULL;
Ian Rogers4dd71f12011-08-16 14:16:02 -0700444 } else {
445 // TODO: create a JNI weak global reference for method
446 bool success = EnsureInvokeStub(method);
447 if (!success) {
448 // TODO: throw OutOfMemoryException
449 return NULL;
450 }
451 return reinterpret_cast<jmethodID>(method);
Carl Shapiro83ab4f32011-08-15 20:21:39 -0700452 }
Carl Shapiroea4dca82011-08-01 13:45:38 -0700453}
454
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700455jobject CallObjectMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700456 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700457 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700458 return NULL;
459}
460
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700461jobject CallObjectMethodV(JNIEnv* env,
462 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700463 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700464 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700465 return NULL;
466}
467
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700468jobject CallObjectMethodA(JNIEnv* env,
469 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700470 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700471 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700472 return NULL;
473}
474
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700475jboolean CallBooleanMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700476 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700477 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700478 return JNI_FALSE;
479}
480
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700481jboolean CallBooleanMethodV(JNIEnv* env,
482 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700483 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700484 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700485 return JNI_FALSE;
486}
487
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700488jboolean CallBooleanMethodA(JNIEnv* env,
489 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700490 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700491 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700492 return JNI_FALSE;
493}
494
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700495jbyte CallByteMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700496 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700497 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700498 return 0;
499}
500
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700501jbyte CallByteMethodV(JNIEnv* env,
502 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700503 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700504 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700505 return 0;
506}
507
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700508jbyte CallByteMethodA(JNIEnv* env,
509 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700510 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700511 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700512 return 0;
513}
514
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700515jchar CallCharMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700516 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700517 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700518 return 0;
519}
520
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700521jchar CallCharMethodV(JNIEnv* env,
522 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700523 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700524 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700525 return 0;
526}
527
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700528jchar CallCharMethodA(JNIEnv* env,
529 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700530 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700531 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700532 return 0;
533}
534
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700535jshort CallShortMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700536 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700537 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700538 return 0;
539}
540
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700541jshort CallShortMethodV(JNIEnv* env,
542 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700543 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700544 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700545 return 0;
546}
547
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700548jshort CallShortMethodA(JNIEnv* env,
549 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700550 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700551 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700552 return 0;
553}
554
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700555jint CallIntMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700556 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700557 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700558 return 0;
559}
560
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700561jint CallIntMethodV(JNIEnv* env,
562 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700563 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700564 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700565 return 0;
566}
567
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700568jint CallIntMethodA(JNIEnv* env,
569 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700570 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700571 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700572 return 0;
573}
574
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700575jlong CallLongMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700576 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700577 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700578 return 0;
579}
580
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700581jlong CallLongMethodV(JNIEnv* env,
582 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700583 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700584 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700585 return 0;
586}
587
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700588jlong CallLongMethodA(JNIEnv* env,
589 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700590 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700591 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700592 return 0;
593}
594
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700595jfloat CallFloatMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700596 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700597 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700598 return 0;
599}
600
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700601jfloat CallFloatMethodV(JNIEnv* env,
602 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700603 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700604 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700605 return 0;
606}
607
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700608jfloat CallFloatMethodA(JNIEnv* env,
609 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700610 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700611 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700612 return 0;
613}
614
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700615jdouble CallDoubleMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700616 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700617 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700618 return 0;
619}
620
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700621jdouble CallDoubleMethodV(JNIEnv* env,
622 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700623 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700624 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700625 return 0;
626}
627
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700628jdouble CallDoubleMethodA(JNIEnv* env,
629 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700630 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700631 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700632 return 0;
633}
634
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700635void CallVoidMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700636 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700637 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700638}
639
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700640void CallVoidMethodV(JNIEnv* env, jobject obj,
641 jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700642 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700643 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700644}
645
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700646void CallVoidMethodA(JNIEnv* env, jobject obj,
647 jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700648 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700649 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700650}
651
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700652jobject CallNonvirtualObjectMethod(JNIEnv* env,
653 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700654 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700655 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700656 return NULL;
657}
658
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700659jobject CallNonvirtualObjectMethodV(JNIEnv* env,
660 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700661 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700662 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700663 return NULL;
664}
665
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700666jobject CallNonvirtualObjectMethodA(JNIEnv* env,
667 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700668 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700669 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700670 return NULL;
671}
672
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700673jboolean CallNonvirtualBooleanMethod(JNIEnv* env,
674 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700675 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700676 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700677 return JNI_FALSE;
678}
679
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700680jboolean CallNonvirtualBooleanMethodV(JNIEnv* env,
681 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700682 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700683 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700684 return JNI_FALSE;
685}
686
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700687jboolean CallNonvirtualBooleanMethodA(JNIEnv* env,
688 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700689 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700690 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700691 return JNI_FALSE;
692}
693
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700694jbyte CallNonvirtualByteMethod(JNIEnv* env,
695 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700696 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700697 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700698 return 0;
699}
700
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700701jbyte CallNonvirtualByteMethodV(JNIEnv* env,
702 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700703 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700704 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700705 return 0;
706}
707
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700708jbyte CallNonvirtualByteMethodA(JNIEnv* env,
709 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700710 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700711 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700712 return 0;
713}
714
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700715jchar CallNonvirtualCharMethod(JNIEnv* env,
716 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700717 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700718 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700719 return 0;
720}
721
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700722jchar CallNonvirtualCharMethodV(JNIEnv* env,
723 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700724 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700725 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700726 return 0;
727}
728
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700729jchar CallNonvirtualCharMethodA(JNIEnv* env,
730 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700731 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700732 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700733 return 0;
734}
735
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700736jshort CallNonvirtualShortMethod(JNIEnv* env,
737 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700738 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700739 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700740 return 0;
741}
742
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700743jshort CallNonvirtualShortMethodV(JNIEnv* env,
744 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700745 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700746 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700747 return 0;
748}
749
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700750jshort CallNonvirtualShortMethodA(JNIEnv* env,
751 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700752 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700753 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700754 return 0;
755}
756
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700757jint CallNonvirtualIntMethod(JNIEnv* env,
758 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700759 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700760 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700761 return 0;
762}
763
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700764jint CallNonvirtualIntMethodV(JNIEnv* env,
765 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700766 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700767 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700768 return 0;
769}
770
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700771jint CallNonvirtualIntMethodA(JNIEnv* env,
772 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700773 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700774 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700775 return 0;
776}
777
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700778jlong CallNonvirtualLongMethod(JNIEnv* env,
779 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700780 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700781 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700782 return 0;
783}
784
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700785jlong CallNonvirtualLongMethodV(JNIEnv* env,
786 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700787 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700788 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700789 return 0;
790}
791
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700792jlong CallNonvirtualLongMethodA(JNIEnv* env,
793 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700794 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700795 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700796 return 0;
797}
798
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700799jfloat CallNonvirtualFloatMethod(JNIEnv* env,
800 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700801 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700802 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700803 return 0;
804}
805
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700806jfloat CallNonvirtualFloatMethodV(JNIEnv* env,
807 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700808 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700809 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700810 return 0;
811}
812
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700813jfloat CallNonvirtualFloatMethodA(JNIEnv* env,
814 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700815 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700816 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700817 return 0;
818}
819
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700820jdouble CallNonvirtualDoubleMethod(JNIEnv* env,
821 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700822 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700823 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700824 return 0;
825}
826
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700827jdouble CallNonvirtualDoubleMethodV(JNIEnv* env,
828 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700829 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700830 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700831 return 0;
832}
833
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700834jdouble CallNonvirtualDoubleMethodA(JNIEnv* env,
835 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700836 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700837 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700838 return 0;
839}
840
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700841void CallNonvirtualVoidMethod(JNIEnv* env,
842 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700843 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700844 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700845}
846
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700847void CallNonvirtualVoidMethodV(JNIEnv* env,
848 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700849 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700850 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700851}
852
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700853void CallNonvirtualVoidMethodA(JNIEnv* env,
854 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700855 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700856 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700857}
858
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700859jfieldID GetFieldID(JNIEnv* env,
860 jclass clazz, const char* name, const char* sig) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700861 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700862 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700863 return NULL;
864}
865
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700866jobject GetObjectField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700867 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700868 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700869 return NULL;
870}
871
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700872jboolean GetBooleanField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700873 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700874 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700875 return JNI_FALSE;
876}
877
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700878jbyte GetByteField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700879 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700880 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700881 return 0;
882}
883
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700884jchar GetCharField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700885 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700886 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700887 return 0;
888}
889
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700890jshort GetShortField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700891 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700892 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700893 return 0;
894}
895
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700896jint GetIntField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700897 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700898 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700899 return 0;
900}
901
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700902jlong GetLongField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700903 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700904 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700905 return 0;
906}
907
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700908jfloat GetFloatField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700909 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700910 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700911 return 0;
912}
913
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700914jdouble GetDoubleField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700915 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700916 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700917 return 0;
918}
919
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700920void SetObjectField(JNIEnv* env, jobject obj, jfieldID fieldID, jobject val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700921 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700922 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700923}
924
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700925void SetBooleanField(JNIEnv* env, jobject obj, jfieldID fieldID, jboolean val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700926 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700927 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700928}
929
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700930void SetByteField(JNIEnv* env, jobject obj, jfieldID fieldID, jbyte val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700931 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700932 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700933}
934
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700935void SetCharField(JNIEnv* env, jobject obj, jfieldID fieldID, jchar val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700936 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700937 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700938}
939
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700940void SetShortField(JNIEnv* env, jobject obj, jfieldID fieldID, jshort val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700941 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700942 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700943}
944
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700945void SetIntField(JNIEnv* env, jobject obj, jfieldID fieldID, jint val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700946 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700947 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700948}
949
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700950void SetLongField(JNIEnv* env, jobject obj, jfieldID fieldID, jlong val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700951 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700952 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700953}
954
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700955void SetFloatField(JNIEnv* env, jobject obj, jfieldID fieldID, jfloat val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700956 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700957 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700958}
959
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700960void SetDoubleField(JNIEnv* env, jobject obj, jfieldID fieldID, jdouble val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700961 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700962 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700963}
964
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700965jmethodID GetStaticMethodID(JNIEnv* env,
966 jclass clazz, const char* name, const char* sig) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700967 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -0700968 // TODO: DecodeReference
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700969 Class* klass = reinterpret_cast<Class*>(clazz);
Carl Shapiro83ab4f32011-08-15 20:21:39 -0700970 if (!klass->IsInitialized()) {
971 // TODO: initialize the class
972 }
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700973 Method* method = klass->FindDirectMethod(name, sig);
Ian Rogers4dd71f12011-08-16 14:16:02 -0700974 if (method == NULL) {
975 Thread* self = Thread::Current();
976 std::string class_name = klass->GetDescriptor().ToString();
977 // TODO: pretty print method names through a single routine
978 // TODO: may want to FindVirtualMethod to give more informative error
979 // message here
980 self->ThrowNewException("Ljava/lang/NoSuchMethodError;",
981 "no method \"%s.%s%s\"",
982 class_name.c_str(), name, sig);
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700983 return NULL;
Ian Rogers4dd71f12011-08-16 14:16:02 -0700984 } else if (!method->IsStatic()) {
985 Thread* self = Thread::Current();
986 std::string class_name = klass->GetDescriptor().ToString();
987 // TODO: pretty print method names through a single routine
988 self->ThrowNewException("Ljava/lang/NoSuchMethodError;",
989 "method \"%s.%s%s\" is not static",
990 class_name.c_str(), name, sig);
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700991 return NULL;
Ian Rogers4dd71f12011-08-16 14:16:02 -0700992 } else {
993 // TODO: create a JNI weak global reference for method
994 bool success = EnsureInvokeStub(method);
995 if (!success) {
996 // TODO: throw OutOfMemoryException
997 return NULL;
998 }
999 return reinterpret_cast<jmethodID>(method);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001000 }
Carl Shapiroea4dca82011-08-01 13:45:38 -07001001}
1002
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001003jobject CallStaticObjectMethod(JNIEnv* env,
1004 jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001005 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001006 va_list ap;
1007 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001008 JValue result = InvokeWithVarArgs(ts.Self(), NULL, methodID, ap);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001009 return AddLocalReference<jobject>(ts, result.l);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001010}
1011
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001012jobject CallStaticObjectMethodV(JNIEnv* env,
1013 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001014 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001015 JValue result = InvokeWithVarArgs(ts.Self(), NULL, methodID, args);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001016 return AddLocalReference<jobject>(ts, result.l);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001017}
1018
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001019jobject CallStaticObjectMethodA(JNIEnv* env,
1020 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001021 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001022 JValue result = InvokeWithJValues(ts.Self(), NULL, methodID, args);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001023 return AddLocalReference<jobject>(ts, result.l);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001024}
1025
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001026jboolean CallStaticBooleanMethod(JNIEnv* env,
1027 jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001028 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001029 va_list ap;
1030 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001031 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).z;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001032}
1033
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001034jboolean CallStaticBooleanMethodV(JNIEnv* env,
1035 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001036 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001037 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).z;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001038}
1039
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001040jboolean CallStaticBooleanMethodA(JNIEnv* env,
1041 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001042 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001043 return InvokeWithJValues(ts.Self(), NULL, methodID, args).z;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001044}
1045
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001046jbyte CallStaticByteMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001047 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001048 va_list ap;
1049 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001050 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).b;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001051}
1052
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001053jbyte CallStaticByteMethodV(JNIEnv* env,
1054 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001055 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001056 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).b;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001057}
1058
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001059jbyte CallStaticByteMethodA(JNIEnv* env,
1060 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001061 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001062 return InvokeWithJValues(ts.Self(), NULL, methodID, args).b;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001063}
1064
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001065jchar CallStaticCharMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001066 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001067 va_list ap;
1068 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001069 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).c;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001070}
1071
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001072jchar CallStaticCharMethodV(JNIEnv* env,
1073 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001074 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001075 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).c;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001076}
1077
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001078jchar CallStaticCharMethodA(JNIEnv* env,
1079 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001080 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001081 return InvokeWithJValues(ts.Self(), NULL, methodID, args).c;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001082}
1083
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001084jshort CallStaticShortMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001085 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001086 va_list ap;
1087 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001088 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).s;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001089}
1090
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001091jshort CallStaticShortMethodV(JNIEnv* env,
1092 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001093 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001094 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).s;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001095}
1096
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001097jshort CallStaticShortMethodA(JNIEnv* env,
1098 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001099 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001100 return InvokeWithJValues(ts.Self(), NULL, methodID, args).s;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001101}
1102
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001103jint CallStaticIntMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001104 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001105 va_list ap;
1106 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001107 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).i;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001108}
1109
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001110jint CallStaticIntMethodV(JNIEnv* env,
1111 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001112 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001113 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).i;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001114}
1115
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001116jint CallStaticIntMethodA(JNIEnv* env,
1117 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001118 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001119 return InvokeWithJValues(ts.Self(), NULL, methodID, args).i;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001120}
1121
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001122jlong CallStaticLongMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001123 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001124 va_list ap;
1125 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001126 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).j;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001127}
1128
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001129jlong CallStaticLongMethodV(JNIEnv* env,
1130 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001131 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001132 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).j;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001133}
1134
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001135jlong CallStaticLongMethodA(JNIEnv* env,
1136 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001137 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001138 return InvokeWithJValues(ts.Self(), NULL, methodID, args).j;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001139}
1140
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001141jfloat CallStaticFloatMethod(JNIEnv* env, jclass cls, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001142 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001143 va_list ap;
1144 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001145 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).f;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001146}
1147
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001148jfloat CallStaticFloatMethodV(JNIEnv* env,
1149 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001150 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001151 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).f;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001152}
1153
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001154jfloat CallStaticFloatMethodA(JNIEnv* env,
1155 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001156 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001157 return InvokeWithJValues(ts.Self(), NULL, methodID, args).f;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001158}
1159
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001160jdouble CallStaticDoubleMethod(JNIEnv* env, jclass cls, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001161 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001162 va_list ap;
1163 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001164 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).d;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001165}
1166
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001167jdouble CallStaticDoubleMethodV(JNIEnv* env,
1168 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001169 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001170 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).d;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001171}
1172
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001173jdouble CallStaticDoubleMethodA(JNIEnv* env,
1174 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001175 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001176 return InvokeWithJValues(ts.Self(), NULL, methodID, args).d;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001177}
1178
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001179void CallStaticVoidMethod(JNIEnv* env, jclass cls, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001180 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001181 va_list ap;
1182 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001183 InvokeWithVarArgs(ts.Self(), NULL, methodID, ap);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001184}
1185
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001186void CallStaticVoidMethodV(JNIEnv* env,
1187 jclass cls, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001188 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001189 InvokeWithVarArgs(ts.Self(), NULL, methodID, args);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001190}
1191
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001192void CallStaticVoidMethodA(JNIEnv* env,
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001193 jclass cls, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001194 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001195 InvokeWithJValues(ts.Self(), NULL, methodID, args);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001196}
1197
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001198jfieldID GetStaticFieldID(JNIEnv* env,
1199 jclass clazz, const char* name, const char* sig) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001200 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001201 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001202 return 0;
1203}
1204
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001205jobject GetStaticObjectField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001206 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001207 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001208 return NULL;
1209}
1210
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001211jboolean GetStaticBooleanField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001212 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001213 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001214 return JNI_FALSE;
1215}
1216
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001217jbyte GetStaticByteField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001218 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001219 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001220 return 0;
1221}
1222
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001223jchar GetStaticCharField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001224 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001225 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001226 return 0;
1227}
1228
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001229jshort GetStaticShortField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001230 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001231 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001232 return 0;
1233}
1234
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001235jint GetStaticIntField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001236 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001237 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001238 return 0;
1239}
1240
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001241jlong GetStaticLongField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001242 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001243 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001244 return 0;
1245}
1246
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001247jfloat GetStaticFloatField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001248 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001249 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001250 return 0;
1251}
1252
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001253jdouble GetStaticDoubleField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001254 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001255 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001256 return 0;
1257}
1258
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001259void SetStaticObjectField(JNIEnv* env,
1260 jclass clazz, jfieldID fieldID, jobject value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001261 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001262 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001263}
1264
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001265void SetStaticBooleanField(JNIEnv* env,
1266 jclass clazz, jfieldID fieldID, jboolean value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001267 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001268 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001269}
1270
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001271void SetStaticByteField(JNIEnv* env,
1272 jclass clazz, jfieldID fieldID, jbyte value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001273 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001274 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001275}
1276
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001277void SetStaticCharField(JNIEnv* env,
1278 jclass clazz, jfieldID fieldID, jchar value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001279 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001280 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001281}
1282
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001283void SetStaticShortField(JNIEnv* env,
1284 jclass clazz, jfieldID fieldID, jshort value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001285 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001286 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001287}
1288
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001289void SetStaticIntField(JNIEnv* env,
1290 jclass clazz, jfieldID fieldID, jint value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001291 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001292 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001293}
1294
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001295void SetStaticLongField(JNIEnv* env,
1296 jclass clazz, jfieldID fieldID, jlong value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001297 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001298 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001299}
1300
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001301void SetStaticFloatField(JNIEnv* env,
1302 jclass clazz, jfieldID fieldID, jfloat value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001303 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001304 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001305}
1306
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001307void SetStaticDoubleField(JNIEnv* env,
1308 jclass clazz, jfieldID fieldID, jdouble value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001309 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001310 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001311}
1312
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001313jstring NewString(JNIEnv* env, const jchar* unicode, jsize len) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001314 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001315 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001316 return NULL;
1317}
1318
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001319jsize GetStringLength(JNIEnv* env, jstring str) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001320 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001321 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001322 return 0;
1323}
1324
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001325const jchar* GetStringChars(JNIEnv* env, jstring str, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001326 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001327 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001328 return NULL;
1329}
1330
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001331void ReleaseStringChars(JNIEnv* env, jstring str, const jchar* chars) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001332 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001333 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001334}
1335
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001336jstring NewStringUTF(JNIEnv* env, const char* utf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001337 ScopedJniThreadState ts(env);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001338 if (utf == NULL) {
1339 return NULL;
1340 }
1341 size_t char_count = String::ModifiedUtf8Len(utf);
1342 String* result = String::AllocFromModifiedUtf8(char_count, utf);
1343 return AddLocalReference<jstring>(ts, result);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001344}
1345
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001346jsize GetStringUTFLength(JNIEnv* env, jstring str) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001347 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001348 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001349 return 0;
1350}
1351
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001352const char* GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001353 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001354 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001355 return NULL;
1356}
1357
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001358void ReleaseStringUTFChars(JNIEnv* env, jstring str, const char* chars) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001359 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001360 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001361}
1362
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001363jsize GetArrayLength(JNIEnv* env, jarray array) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001364 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001365 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001366 return 0;
1367}
1368
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001369jobject GetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001370 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001371 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001372 return NULL;
1373}
1374
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001375void SetObjectArrayElement(JNIEnv* env,
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001376 jobjectArray java_array, jsize index, jobject java_value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001377 ScopedJniThreadState ts(env);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001378 // TODO: DecodeReference
1379 ObjectArray<Object>* array = reinterpret_cast<ObjectArray<Object>*>(java_array);
1380 Object* value = reinterpret_cast<Object*>(java_value);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001381 array->Set(index, value);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001382}
1383
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001384template<typename JniT, typename ArtT>
1385JniT NewPrimitiveArray(ScopedJniThreadState& ts, jsize length) {
1386 CHECK_GE(length, 0); // TODO: ReportJniError
1387 ArtT* result = ArtT::Alloc(length);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001388 return AddLocalReference<JniT>(ts, result);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001389}
1390
Elliott Hughesf2682d52011-08-15 16:37:04 -07001391jbooleanArray NewBooleanArray(JNIEnv* env, jsize length) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001392 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001393 return NewPrimitiveArray<jbooleanArray, BooleanArray>(ts, length);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001394}
1395
Elliott Hughesf2682d52011-08-15 16:37:04 -07001396jbyteArray NewByteArray(JNIEnv* env, jsize length) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001397 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001398 return NewPrimitiveArray<jbyteArray, ByteArray>(ts, length);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001399}
1400
Elliott Hughesf2682d52011-08-15 16:37:04 -07001401jcharArray NewCharArray(JNIEnv* env, jsize length) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001402 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001403 return NewPrimitiveArray<jcharArray, CharArray>(ts, length);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001404}
1405
Elliott Hughesf2682d52011-08-15 16:37:04 -07001406jdoubleArray NewDoubleArray(JNIEnv* env, jsize length) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001407 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001408 return NewPrimitiveArray<jdoubleArray, DoubleArray>(ts, length);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001409}
1410
Elliott Hughesf2682d52011-08-15 16:37:04 -07001411jfloatArray NewFloatArray(JNIEnv* env, jsize length) {
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001412 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001413 return NewPrimitiveArray<jfloatArray, FloatArray>(ts, length);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001414}
1415
Elliott Hughesf2682d52011-08-15 16:37:04 -07001416jintArray NewIntArray(JNIEnv* env, jsize length) {
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001417 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001418 return NewPrimitiveArray<jintArray, IntArray>(ts, length);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001419}
1420
Elliott Hughesf2682d52011-08-15 16:37:04 -07001421jlongArray NewLongArray(JNIEnv* env, jsize length) {
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001422 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001423 return NewPrimitiveArray<jlongArray, LongArray>(ts, length);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001424}
1425
Elliott Hughesf2682d52011-08-15 16:37:04 -07001426jobjectArray NewObjectArray(JNIEnv* env, jsize length, jclass element_jclass, jobject initial_element) {
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001427 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001428 CHECK_GE(length, 0); // TODO: ReportJniError
1429
1430 // Compute the array class corresponding to the given element class.
1431 // TODO: DecodeReference
1432 Class* element_class = reinterpret_cast<Class*>(element_jclass);
1433 std::string descriptor;
1434 descriptor += "[";
1435 descriptor += element_class->GetDescriptor().ToString();
1436
1437 // Find the class.
1438 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1439 // TODO: need to get the appropriate ClassLoader.
1440 Class* array_class = class_linker->FindClass(descriptor, NULL);
1441 if (array_class == NULL) {
1442 return NULL;
1443 }
1444
1445 ObjectArray<Object>* result = ObjectArray<Object>::Alloc(array_class, length);
1446 CHECK(initial_element == NULL); // TODO: support initial_element
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001447 return AddLocalReference<jobjectArray>(ts, result);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001448}
1449
1450jshortArray NewShortArray(JNIEnv* env, jsize length) {
1451 ScopedJniThreadState ts(env);
1452 return NewPrimitiveArray<jshortArray, ShortArray>(ts, length);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001453}
1454
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001455jboolean* GetBooleanArrayElements(JNIEnv* env,
1456 jbooleanArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001457 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001458 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001459 return NULL;
1460}
1461
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001462jbyte* GetByteArrayElements(JNIEnv* env, jbyteArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001463 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001464 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001465 return NULL;
1466}
1467
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001468jchar* GetCharArrayElements(JNIEnv* env, jcharArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001469 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001470 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001471 return NULL;
1472}
1473
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001474jshort* GetShortArrayElements(JNIEnv* env,
1475 jshortArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001476 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001477 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001478 return NULL;
1479}
1480
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001481jint* GetIntArrayElements(JNIEnv* env, jintArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001482 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001483 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001484 return NULL;
1485}
1486
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001487jlong* GetLongArrayElements(JNIEnv* env, jlongArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001488 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001489 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001490 return NULL;
1491}
1492
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001493jfloat* GetFloatArrayElements(JNIEnv* env,
1494 jfloatArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001495 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001496 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001497 return NULL;
1498}
1499
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001500jdouble* GetDoubleArrayElements(JNIEnv* env,
1501 jdoubleArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001502 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001503 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001504 return NULL;
1505}
1506
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001507void ReleaseBooleanArrayElements(JNIEnv* env,
1508 jbooleanArray array, jboolean* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001509 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001510 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001511}
1512
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001513void ReleaseByteArrayElements(JNIEnv* env,
1514 jbyteArray array, jbyte* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001515 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001516 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001517}
1518
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001519void ReleaseCharArrayElements(JNIEnv* env,
1520 jcharArray array, jchar* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001521 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001522 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001523}
1524
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001525void ReleaseShortArrayElements(JNIEnv* env,
1526 jshortArray array, jshort* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001527 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001528 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001529}
1530
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001531void ReleaseIntArrayElements(JNIEnv* env,
1532 jintArray array, jint* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001533 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001534 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001535}
1536
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001537void ReleaseLongArrayElements(JNIEnv* env,
1538 jlongArray array, jlong* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001539 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001540 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001541}
1542
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001543void ReleaseFloatArrayElements(JNIEnv* env,
1544 jfloatArray array, jfloat* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001545 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001546 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001547}
1548
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001549void ReleaseDoubleArrayElements(JNIEnv* env,
1550 jdoubleArray array, jdouble* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001551 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001552 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001553}
1554
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001555void GetBooleanArrayRegion(JNIEnv* env,
1556 jbooleanArray array, jsize start, jsize l, jboolean* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001557 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001558 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001559}
1560
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001561void GetByteArrayRegion(JNIEnv* env,
1562 jbyteArray array, jsize start, jsize len, jbyte* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001563 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001564 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001565}
1566
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001567void GetCharArrayRegion(JNIEnv* env,
1568 jcharArray array, jsize start, jsize len, jchar* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001569 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001570 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001571}
1572
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001573void GetShortArrayRegion(JNIEnv* env,
1574 jshortArray array, jsize start, jsize len, jshort* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001575 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001576 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001577}
1578
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001579void GetIntArrayRegion(JNIEnv* env,
1580 jintArray array, jsize start, jsize len, jint* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001581 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001582 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001583}
1584
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001585void GetLongArrayRegion(JNIEnv* env,
1586 jlongArray array, jsize start, jsize len, jlong* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001587 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001588 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001589}
1590
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001591void GetFloatArrayRegion(JNIEnv* env,
1592 jfloatArray array, jsize start, jsize len, jfloat* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001593 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001594 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001595}
1596
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001597void GetDoubleArrayRegion(JNIEnv* env,
1598 jdoubleArray array, jsize start, jsize len, jdouble* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001599 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001600 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001601}
1602
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001603void SetBooleanArrayRegion(JNIEnv* env,
1604 jbooleanArray array, jsize start, jsize l, const jboolean* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001605 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001606 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001607}
1608
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001609void SetByteArrayRegion(JNIEnv* env,
1610 jbyteArray array, jsize start, jsize len, const jbyte* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001611 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001612 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001613}
1614
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001615void SetCharArrayRegion(JNIEnv* env,
1616 jcharArray array, jsize start, jsize len, const jchar* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001617 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001618 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001619}
1620
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001621void SetShortArrayRegion(JNIEnv* env,
1622 jshortArray array, jsize start, jsize len, const jshort* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001623 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001624 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001625}
1626
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001627void SetIntArrayRegion(JNIEnv* env,
1628 jintArray array, jsize start, jsize len, const jint* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001629 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001630 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001631}
1632
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001633void SetLongArrayRegion(JNIEnv* env,
1634 jlongArray array, jsize start, jsize len, const jlong* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001635 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001636 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001637}
1638
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001639void SetFloatArrayRegion(JNIEnv* env,
1640 jfloatArray array, jsize start, jsize len, const jfloat* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001641 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001642 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001643}
1644
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001645void SetDoubleArrayRegion(JNIEnv* env,
1646 jdoubleArray array, jsize start, jsize len, const jdouble* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001647 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001648 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001649}
1650
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001651jint RegisterNatives(JNIEnv* env,
1652 jclass clazz, const JNINativeMethod* methods, jint nMethods) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001653 ScopedJniThreadState ts(env);
Ian Rogers4dd71f12011-08-16 14:16:02 -07001654 // TODO: retrieve handle value for class
1655 Class* klass = reinterpret_cast<Class*>(clazz);
1656 for(int i = 0; i < nMethods; i++) {
1657 const char* name = methods[i].name;
1658 const char* sig = methods[i].signature;
1659 Method* method = klass->FindDirectMethod(name, sig);
1660 if (method == NULL) {
1661 method = klass->FindVirtualMethod(name, sig);
1662 }
1663 if (method == NULL) {
1664 Thread* self = Thread::Current();
1665 std::string class_name = klass->GetDescriptor().ToString();
1666 // TODO: pretty print method names through a single routine
1667 self->ThrowNewException("Ljava/lang/NoSuchMethodError;",
1668 "no method \"%s.%s%s\"",
1669 class_name.c_str(), name, sig);
1670 return JNI_ERR;
1671 } else if (!method->IsNative()) {
1672 Thread* self = Thread::Current();
1673 std::string class_name = klass->GetDescriptor().ToString();
1674 // TODO: pretty print method names through a single routine
1675 self->ThrowNewException("Ljava/lang/NoSuchMethodError;",
1676 "method \"%s.%s%s\" is not native",
1677 class_name.c_str(), name, sig);
1678 return JNI_ERR;
1679 }
1680 method->RegisterNative(methods[i].fnPtr);
1681 }
1682 return JNI_OK;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001683}
1684
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001685jint UnregisterNatives(JNIEnv* env, jclass clazz) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001686 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001687 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001688 return 0;
1689}
1690
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001691jint MonitorEnter(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001692 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001693 UNIMPLEMENTED(WARNING);
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001694 return 0;
1695}
1696
1697jint MonitorExit(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001698 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001699 UNIMPLEMENTED(WARNING);
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001700 return 0;
1701}
1702
Elliott Hughesb20a5542011-08-12 18:03:12 -07001703jint GetJavaVM(JNIEnv* env, JavaVM** vm) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001704 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001705 Runtime* runtime = Runtime::Current();
1706 if (runtime != NULL) {
1707 *vm = runtime->GetJavaVM();
1708 } else {
1709 *vm = NULL;
1710 }
1711 return (*vm != NULL) ? JNI_OK : JNI_ERR;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001712}
1713
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001714void GetStringRegion(JNIEnv* env,
1715 jstring str, jsize start, jsize len, jchar* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001716 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001717 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001718}
1719
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001720void GetStringUTFRegion(JNIEnv* env,
1721 jstring str, jsize start, jsize len, char* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001722 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001723 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001724}
1725
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001726void* GetPrimitiveArrayCritical(JNIEnv* env,
1727 jarray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001728 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001729 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001730 return NULL;
1731}
1732
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001733void ReleasePrimitiveArrayCritical(JNIEnv* env,
1734 jarray array, void* carray, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001735 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001736 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001737}
1738
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001739const jchar* GetStringCritical(JNIEnv* env, jstring s, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001740 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001741 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001742 return NULL;
1743}
1744
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001745void ReleaseStringCritical(JNIEnv* env, jstring s, const jchar* cstr) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001746 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001747 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001748}
1749
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001750jweak NewWeakGlobalRef(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001751 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001752 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001753 return NULL;
1754}
1755
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001756void DeleteWeakGlobalRef(JNIEnv* env, jweak obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001757 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001758 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001759}
1760
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001761jboolean ExceptionCheck(JNIEnv* env) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001762 ScopedJniThreadState ts(env);
Elliott Hughesb20a5542011-08-12 18:03:12 -07001763 return ts.Self()->IsExceptionPending() ? JNI_TRUE : JNI_FALSE;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001764}
1765
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001766jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001767 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001768 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001769 return NULL;
1770}
1771
1772
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001773void* GetDirectBufferAddress(JNIEnv* env, jobject buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001774 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001775 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001776 return NULL;
1777}
1778
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001779jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001780 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001781 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001782 return 0;
1783}
1784
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001785jobjectRefType GetObjectRefType(JNIEnv* env, jobject jobj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001786 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001787 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001788 return JNIInvalidRefType;
1789}
1790
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001791static const struct JNINativeInterface gNativeInterface = {
Carl Shapiroea4dca82011-08-01 13:45:38 -07001792 NULL, // reserved0.
1793 NULL, // reserved1.
1794 NULL, // reserved2.
1795 NULL, // reserved3.
1796 GetVersion,
1797 DefineClass,
1798 FindClass,
1799 FromReflectedMethod,
1800 FromReflectedField,
1801 ToReflectedMethod,
1802 GetSuperclass,
1803 IsAssignableFrom,
1804 ToReflectedField,
1805 Throw,
1806 ThrowNew,
1807 ExceptionOccurred,
1808 ExceptionDescribe,
1809 ExceptionClear,
1810 FatalError,
1811 PushLocalFrame,
1812 PopLocalFrame,
1813 NewGlobalRef,
1814 DeleteGlobalRef,
1815 DeleteLocalRef,
1816 IsSameObject,
1817 NewLocalRef,
1818 EnsureLocalCapacity,
1819 AllocObject,
1820 NewObject,
1821 NewObjectV,
1822 NewObjectA,
1823 GetObjectClass,
1824 IsInstanceOf,
1825 GetMethodID,
1826 CallObjectMethod,
1827 CallObjectMethodV,
1828 CallObjectMethodA,
1829 CallBooleanMethod,
1830 CallBooleanMethodV,
1831 CallBooleanMethodA,
1832 CallByteMethod,
1833 CallByteMethodV,
1834 CallByteMethodA,
1835 CallCharMethod,
1836 CallCharMethodV,
1837 CallCharMethodA,
1838 CallShortMethod,
1839 CallShortMethodV,
1840 CallShortMethodA,
1841 CallIntMethod,
1842 CallIntMethodV,
1843 CallIntMethodA,
1844 CallLongMethod,
1845 CallLongMethodV,
1846 CallLongMethodA,
1847 CallFloatMethod,
1848 CallFloatMethodV,
1849 CallFloatMethodA,
1850 CallDoubleMethod,
1851 CallDoubleMethodV,
1852 CallDoubleMethodA,
1853 CallVoidMethod,
1854 CallVoidMethodV,
1855 CallVoidMethodA,
1856 CallNonvirtualObjectMethod,
1857 CallNonvirtualObjectMethodV,
1858 CallNonvirtualObjectMethodA,
1859 CallNonvirtualBooleanMethod,
1860 CallNonvirtualBooleanMethodV,
1861 CallNonvirtualBooleanMethodA,
1862 CallNonvirtualByteMethod,
1863 CallNonvirtualByteMethodV,
1864 CallNonvirtualByteMethodA,
1865 CallNonvirtualCharMethod,
1866 CallNonvirtualCharMethodV,
1867 CallNonvirtualCharMethodA,
1868 CallNonvirtualShortMethod,
1869 CallNonvirtualShortMethodV,
1870 CallNonvirtualShortMethodA,
1871 CallNonvirtualIntMethod,
1872 CallNonvirtualIntMethodV,
1873 CallNonvirtualIntMethodA,
1874 CallNonvirtualLongMethod,
1875 CallNonvirtualLongMethodV,
1876 CallNonvirtualLongMethodA,
1877 CallNonvirtualFloatMethod,
1878 CallNonvirtualFloatMethodV,
1879 CallNonvirtualFloatMethodA,
1880 CallNonvirtualDoubleMethod,
1881 CallNonvirtualDoubleMethodV,
1882 CallNonvirtualDoubleMethodA,
1883 CallNonvirtualVoidMethod,
1884 CallNonvirtualVoidMethodV,
1885 CallNonvirtualVoidMethodA,
1886 GetFieldID,
1887 GetObjectField,
1888 GetBooleanField,
1889 GetByteField,
1890 GetCharField,
1891 GetShortField,
1892 GetIntField,
1893 GetLongField,
1894 GetFloatField,
1895 GetDoubleField,
1896 SetObjectField,
1897 SetBooleanField,
1898 SetByteField,
1899 SetCharField,
1900 SetShortField,
1901 SetIntField,
1902 SetLongField,
1903 SetFloatField,
1904 SetDoubleField,
1905 GetStaticMethodID,
1906 CallStaticObjectMethod,
1907 CallStaticObjectMethodV,
1908 CallStaticObjectMethodA,
1909 CallStaticBooleanMethod,
1910 CallStaticBooleanMethodV,
1911 CallStaticBooleanMethodA,
1912 CallStaticByteMethod,
1913 CallStaticByteMethodV,
1914 CallStaticByteMethodA,
1915 CallStaticCharMethod,
1916 CallStaticCharMethodV,
1917 CallStaticCharMethodA,
1918 CallStaticShortMethod,
1919 CallStaticShortMethodV,
1920 CallStaticShortMethodA,
1921 CallStaticIntMethod,
1922 CallStaticIntMethodV,
1923 CallStaticIntMethodA,
1924 CallStaticLongMethod,
1925 CallStaticLongMethodV,
1926 CallStaticLongMethodA,
1927 CallStaticFloatMethod,
1928 CallStaticFloatMethodV,
1929 CallStaticFloatMethodA,
1930 CallStaticDoubleMethod,
1931 CallStaticDoubleMethodV,
1932 CallStaticDoubleMethodA,
1933 CallStaticVoidMethod,
1934 CallStaticVoidMethodV,
1935 CallStaticVoidMethodA,
1936 GetStaticFieldID,
1937 GetStaticObjectField,
1938 GetStaticBooleanField,
1939 GetStaticByteField,
1940 GetStaticCharField,
1941 GetStaticShortField,
1942 GetStaticIntField,
1943 GetStaticLongField,
1944 GetStaticFloatField,
1945 GetStaticDoubleField,
1946 SetStaticObjectField,
1947 SetStaticBooleanField,
1948 SetStaticByteField,
1949 SetStaticCharField,
1950 SetStaticShortField,
1951 SetStaticIntField,
1952 SetStaticLongField,
1953 SetStaticFloatField,
1954 SetStaticDoubleField,
1955 NewString,
1956 GetStringLength,
1957 GetStringChars,
1958 ReleaseStringChars,
1959 NewStringUTF,
1960 GetStringUTFLength,
1961 GetStringUTFChars,
1962 ReleaseStringUTFChars,
1963 GetArrayLength,
1964 NewObjectArray,
1965 GetObjectArrayElement,
1966 SetObjectArrayElement,
1967 NewBooleanArray,
1968 NewByteArray,
1969 NewCharArray,
1970 NewShortArray,
1971 NewIntArray,
1972 NewLongArray,
1973 NewFloatArray,
1974 NewDoubleArray,
1975 GetBooleanArrayElements,
1976 GetByteArrayElements,
1977 GetCharArrayElements,
1978 GetShortArrayElements,
1979 GetIntArrayElements,
1980 GetLongArrayElements,
1981 GetFloatArrayElements,
1982 GetDoubleArrayElements,
1983 ReleaseBooleanArrayElements,
1984 ReleaseByteArrayElements,
1985 ReleaseCharArrayElements,
1986 ReleaseShortArrayElements,
1987 ReleaseIntArrayElements,
1988 ReleaseLongArrayElements,
1989 ReleaseFloatArrayElements,
1990 ReleaseDoubleArrayElements,
1991 GetBooleanArrayRegion,
1992 GetByteArrayRegion,
1993 GetCharArrayRegion,
1994 GetShortArrayRegion,
1995 GetIntArrayRegion,
1996 GetLongArrayRegion,
1997 GetFloatArrayRegion,
1998 GetDoubleArrayRegion,
1999 SetBooleanArrayRegion,
2000 SetByteArrayRegion,
2001 SetCharArrayRegion,
2002 SetShortArrayRegion,
2003 SetIntArrayRegion,
2004 SetLongArrayRegion,
2005 SetFloatArrayRegion,
2006 SetDoubleArrayRegion,
2007 RegisterNatives,
2008 UnregisterNatives,
2009 MonitorEnter,
2010 MonitorExit,
2011 GetJavaVM,
2012 GetStringRegion,
2013 GetStringUTFRegion,
2014 GetPrimitiveArrayCritical,
2015 ReleasePrimitiveArrayCritical,
2016 GetStringCritical,
2017 ReleaseStringCritical,
2018 NewWeakGlobalRef,
2019 DeleteWeakGlobalRef,
2020 ExceptionCheck,
2021 NewDirectByteBuffer,
2022 GetDirectBufferAddress,
2023 GetDirectBufferCapacity,
2024 GetObjectRefType,
2025};
2026
Elliott Hughes40ef99e2011-08-11 17:44:34 -07002027void MonitorEnterHelper(JNIEnv* env, jobject obj) {
Elliott Hughes330304d2011-08-12 14:28:05 -07002028 CHECK_EQ(Thread::Current()->GetJniEnv(), env);
Elliott Hughes40ef99e2011-08-11 17:44:34 -07002029 MonitorEnter(env, obj); // Ignore the result.
2030}
2031
2032void MonitorExitHelper(JNIEnv* env, jobject obj) {
Elliott Hughes330304d2011-08-12 14:28:05 -07002033 CHECK_EQ(Thread::Current()->GetJniEnv(), env);
Elliott Hughes40ef99e2011-08-11 17:44:34 -07002034 MonitorExit(env, obj); // Ignore the result.
2035}
2036
Elliott Hughesbbd76712011-08-17 10:25:24 -07002037static const size_t kMonitorTableInitialSize = 32; // Arbitrary.
2038static const size_t kMonitorTableMaxSize = 4096; // Arbitrary sanity check.
2039
2040JNIEnvExt::JNIEnvExt(Thread* self)
2041 : fns(&gNativeInterface),
2042 self(self),
2043 critical(false),
2044 monitor_table("monitor table", kMonitorTableInitialSize, kMonitorTableMaxSize) {
2045 // TODO: kill these.
2046 MonitorEnterHelper = &::art::MonitorEnterHelper;
2047 MonitorExitHelper = &::art::MonitorExitHelper;
Elliott Hughes40ef99e2011-08-11 17:44:34 -07002048}
2049
Carl Shapiroea4dca82011-08-01 13:45:38 -07002050// JNI Invocation interface.
2051
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002052extern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, void** p_env, void* vm_args) {
2053 const JavaVMInitArgs* args = static_cast<JavaVMInitArgs*>(vm_args);
2054 if (args->version < JNI_VERSION_1_2) {
2055 return JNI_EVERSION;
2056 }
2057 Runtime::Options options;
2058 for (int i = 0; i < args->nOptions; ++i) {
2059 JavaVMOption* option = &args->options[i];
Carl Shapirofc322c72011-07-27 00:20:01 -07002060 options.push_back(std::make_pair(StringPiece(option->optionString),
2061 option->extraInfo));
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002062 }
2063 bool ignore_unrecognized = args->ignoreUnrecognized;
Elliott Hughesf2682d52011-08-15 16:37:04 -07002064 Runtime* runtime = Runtime::Create(options, ignore_unrecognized);
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002065 if (runtime == NULL) {
2066 return JNI_ERR;
2067 } else {
2068 *p_env = reinterpret_cast<JNIEnv*>(Thread::Current()->GetJniEnv());
Elliott Hughesf2682d52011-08-15 16:37:04 -07002069 *p_vm = runtime->GetJavaVM();
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002070 return JNI_OK;
2071 }
2072}
2073
Elliott Hughesf2682d52011-08-15 16:37:04 -07002074extern "C" jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize, jsize* vm_count) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002075 Runtime* runtime = Runtime::Current();
2076 if (runtime == NULL) {
Elliott Hughesf2682d52011-08-15 16:37:04 -07002077 *vm_count = 0;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002078 } else {
Elliott Hughesf2682d52011-08-15 16:37:04 -07002079 *vm_count = 1;
2080 vms[0] = runtime->GetJavaVM();
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002081 }
2082 return JNI_OK;
2083}
2084
2085// Historically unsupported.
2086extern "C" jint JNI_GetDefaultJavaVMInitArgs(void* vm_args) {
2087 return JNI_ERR;
2088}
2089
Elliott Hughesf2682d52011-08-15 16:37:04 -07002090jint DestroyJavaVM(JavaVM* vm) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002091 if (vm == NULL) {
2092 return JNI_ERR;
2093 } else {
Elliott Hughesf2682d52011-08-15 16:37:04 -07002094 JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
2095 delete raw_vm->runtime;
2096 raw_vm->runtime = NULL;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002097 return JNI_OK;
2098 }
2099}
2100
Elliott Hughesf2682d52011-08-15 16:37:04 -07002101jint AttachCurrentThread(JavaVM* vm, JNIEnv** p_env, void* thr_args) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002102 if (vm == NULL || p_env == NULL) {
2103 return JNI_ERR;
2104 }
Elliott Hughesf2682d52011-08-15 16:37:04 -07002105 JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
2106 Runtime* runtime = raw_vm->runtime;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002107 const char* name = NULL;
2108 if (thr_args != NULL) {
2109 // TODO: check version
2110 name = static_cast<JavaVMAttachArgs*>(thr_args)->name;
2111 // TODO: thread group
2112 }
Elliott Hughes40ef99e2011-08-11 17:44:34 -07002113 bool success = runtime->AttachCurrentThread(name, p_env);
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002114 if (!success) {
2115 return JNI_ERR;
2116 } else {
2117 return JNI_OK;
2118 }
2119}
2120
Elliott Hughesf2682d52011-08-15 16:37:04 -07002121jint DetachCurrentThread(JavaVM* vm) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002122 if (vm == NULL) {
2123 return JNI_ERR;
2124 } else {
Elliott Hughesf2682d52011-08-15 16:37:04 -07002125 JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
2126 Runtime* runtime = raw_vm->runtime;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002127 runtime->DetachCurrentThread();
2128 return JNI_OK;
2129 }
2130}
2131
Elliott Hughesf2682d52011-08-15 16:37:04 -07002132jint GetEnv(JavaVM* vm, void** env, jint version) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002133 if (version < JNI_VERSION_1_1 || version > JNI_VERSION_1_6) {
2134 return JNI_EVERSION;
2135 }
2136 if (vm == NULL || env == NULL) {
2137 return JNI_ERR;
2138 }
2139 Thread* thread = Thread::Current();
2140 if (thread == NULL) {
2141 *env = NULL;
2142 return JNI_EDETACHED;
2143 }
2144 *env = thread->GetJniEnv();
2145 return JNI_OK;
2146}
2147
Elliott Hughesf2682d52011-08-15 16:37:04 -07002148jint AttachCurrentThreadAsDaemon(JavaVM* vm, JNIEnv** p_env, void* thr_args) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002149 if (vm == NULL || p_env == NULL) {
2150 return JNI_ERR;
2151 }
Elliott Hughesf2682d52011-08-15 16:37:04 -07002152 JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
2153 Runtime* runtime = raw_vm->runtime;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002154 const char* name = NULL;
2155 if (thr_args != NULL) {
2156 // TODO: check version
2157 name = static_cast<JavaVMAttachArgs*>(thr_args)->name;
2158 // TODO: thread group
2159 }
Elliott Hughes40ef99e2011-08-11 17:44:34 -07002160 bool success = runtime->AttachCurrentThreadAsDaemon(name, p_env);
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002161 if (!success) {
2162 return JNI_ERR;
2163 } else {
2164 return JNI_OK;
2165 }
2166}
2167
Elliott Hughesf2682d52011-08-15 16:37:04 -07002168struct JNIInvokeInterface gInvokeInterface = {
Carl Shapiroea4dca82011-08-01 13:45:38 -07002169 NULL, // reserved0
2170 NULL, // reserved1
2171 NULL, // reserved2
2172 DestroyJavaVM,
2173 AttachCurrentThread,
2174 DetachCurrentThread,
2175 GetEnv,
2176 AttachCurrentThreadAsDaemon
2177};
2178
Elliott Hughesbbd76712011-08-17 10:25:24 -07002179static const size_t kPinTableInitialSize = 16;
2180static const size_t kPinTableMaxSize = 1024;
2181
2182JavaVMExt::JavaVMExt(Runtime* runtime)
2183 : fns(&gInvokeInterface),
2184 runtime(runtime),
2185 pin_table("pin table", kPinTableInitialSize, kPinTableMaxSize) {
Elliott Hughesf2682d52011-08-15 16:37:04 -07002186}
2187
Ian Rogersdf20fe02011-07-20 20:34:16 -07002188} // namespace art