blob: 9a2492e7e575be74867c64beaa1f5cc98839829c [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();
92 for (int i = 1, offset = 0; i < shorty.size() - 1; ++i) {
93 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();
130 for (int i = 1, offset = 0; i < shorty.size() - 1; ++i) {
131 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.
218 for (size_t i = 0; i < result.size(); ++i) {
219 if (result[i] == '.') {
220 result[i] = '/';
221 }
222 }
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);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700287 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700288 return NULL;
289}
290
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700291void ExceptionDescribe(JNIEnv* env) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700292 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700293 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700294}
295
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700296void ExceptionClear(JNIEnv* env) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700297 ScopedJniThreadState ts(env);
Elliott Hughesb20a5542011-08-12 18:03:12 -0700298 ts.Self()->ClearException();
Carl Shapiroea4dca82011-08-01 13:45:38 -0700299}
300
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700301void FatalError(JNIEnv* env, const char* msg) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700302 ScopedJniThreadState ts(env);
Elliott Hughesb20a5542011-08-12 18:03:12 -0700303 LOG(FATAL) << "JNI FatalError called: " << msg;
Carl Shapiroea4dca82011-08-01 13:45:38 -0700304}
305
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700306jint PushLocalFrame(JNIEnv* env, jint cap) {
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 return 0;
310}
311
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700312jobject PopLocalFrame(JNIEnv* env, jobject res) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700313 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700314 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700315 return NULL;
316}
317
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700318jobject NewGlobalRef(JNIEnv* env, jobject lobj) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700319 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700320 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700321 return NULL;
322}
323
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700324void DeleteGlobalRef(JNIEnv* env, jobject gref) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700325 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700326 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700327}
328
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700329void DeleteLocalRef(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700330 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -0700331 UNIMPLEMENTED(WARNING);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700332}
333
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700334jboolean IsSameObject(JNIEnv* env, jobject obj1, jobject obj2) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700335 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700336 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700337 return JNI_FALSE;
338}
339
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700340jobject NewLocalRef(JNIEnv* env, jobject ref) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700341 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700342 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700343 return NULL;
344}
345
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700346jint EnsureLocalCapacity(JNIEnv* env, jint) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700347 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700348 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700349 return 0;
350}
351
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700352jobject AllocObject(JNIEnv* env, jclass clazz) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700353 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700354 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700355 return NULL;
356}
357
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700358jobject NewObject(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700359 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700360 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700361 return NULL;
362}
363
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700364jobject NewObjectV(JNIEnv* env,
365 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700366 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700367 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700368 return NULL;
369}
370
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700371jobject NewObjectA(JNIEnv* env,
372 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700373 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700374 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700375 return NULL;
376}
377
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700378jclass GetObjectClass(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700379 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700380 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700381 return NULL;
382}
383
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700384jboolean IsInstanceOf(JNIEnv* env, jobject obj, jclass clazz) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700385 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700386 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700387 return JNI_FALSE;
388}
389
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700390jmethodID GetMethodID(JNIEnv* env,
391 jclass clazz, const char* name, const char* sig) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700392 ScopedJniThreadState ts(env);
Carl Shapiro83ab4f32011-08-15 20:21:39 -0700393 // TODO: retrieve handle value for class
394 Class* klass = reinterpret_cast<Class*>(clazz);
395 if (!klass->IsInitialized()) {
396 // TODO: initialize the class
397 }
398 Method* method = klass->FindVirtualMethod(name, sig);
399 if (method == NULL) {
400 // No virtual method matching the signature. Search declared
401 // private methods and constructors.
402 method = klass->FindDeclaredDirectMethod(name, sig);
403 }
404 if (method == NULL || method->IsStatic()) {
405 LG << "NoSuchMethodError"; // TODO: throw NoSuchMethodError
406 return NULL;
407 }
408 // TODO: create a JNI weak global reference for method
409 bool success = EnsureInvokeStub(method);
410 if (!success) {
411 // TODO: throw OutOfMemoryException
412 return NULL;
413 }
414 return reinterpret_cast<jmethodID>(method);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700415}
416
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700417jobject CallObjectMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700418 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700419 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700420 return NULL;
421}
422
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700423jobject CallObjectMethodV(JNIEnv* env,
424 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700425 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700426 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700427 return NULL;
428}
429
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700430jobject CallObjectMethodA(JNIEnv* env,
431 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700432 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700433 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700434 return NULL;
435}
436
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700437jboolean CallBooleanMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700438 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700439 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700440 return JNI_FALSE;
441}
442
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700443jboolean CallBooleanMethodV(JNIEnv* env,
444 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700445 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700446 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700447 return JNI_FALSE;
448}
449
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700450jboolean CallBooleanMethodA(JNIEnv* env,
451 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700452 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700453 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700454 return JNI_FALSE;
455}
456
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700457jbyte CallByteMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700458 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700459 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700460 return 0;
461}
462
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700463jbyte CallByteMethodV(JNIEnv* env,
464 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700465 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700466 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700467 return 0;
468}
469
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700470jbyte CallByteMethodA(JNIEnv* env,
471 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700472 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700473 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700474 return 0;
475}
476
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700477jchar CallCharMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700478 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700479 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700480 return 0;
481}
482
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700483jchar CallCharMethodV(JNIEnv* env,
484 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700485 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700486 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700487 return 0;
488}
489
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700490jchar CallCharMethodA(JNIEnv* env,
491 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700492 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700493 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700494 return 0;
495}
496
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700497jshort CallShortMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700498 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700499 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700500 return 0;
501}
502
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700503jshort CallShortMethodV(JNIEnv* env,
504 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700505 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700506 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700507 return 0;
508}
509
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700510jshort CallShortMethodA(JNIEnv* env,
511 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700512 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700513 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700514 return 0;
515}
516
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700517jint CallIntMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700518 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700519 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700520 return 0;
521}
522
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700523jint CallIntMethodV(JNIEnv* env,
524 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700525 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700526 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700527 return 0;
528}
529
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700530jint CallIntMethodA(JNIEnv* env,
531 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700532 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700533 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700534 return 0;
535}
536
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700537jlong CallLongMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700538 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700539 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700540 return 0;
541}
542
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700543jlong CallLongMethodV(JNIEnv* env,
544 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700545 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700546 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700547 return 0;
548}
549
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700550jlong CallLongMethodA(JNIEnv* env,
551 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700552 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700553 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700554 return 0;
555}
556
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700557jfloat CallFloatMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700558 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700559 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700560 return 0;
561}
562
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700563jfloat CallFloatMethodV(JNIEnv* env,
564 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700565 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700566 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700567 return 0;
568}
569
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700570jfloat CallFloatMethodA(JNIEnv* env,
571 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700572 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700573 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700574 return 0;
575}
576
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700577jdouble CallDoubleMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700578 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700579 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700580 return 0;
581}
582
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700583jdouble CallDoubleMethodV(JNIEnv* env,
584 jobject obj, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700585 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700586 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700587 return 0;
588}
589
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700590jdouble CallDoubleMethodA(JNIEnv* env,
591 jobject obj, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700592 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700593 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700594 return 0;
595}
596
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700597void CallVoidMethod(JNIEnv* env, jobject obj, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700598 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700599 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700600}
601
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700602void CallVoidMethodV(JNIEnv* env, jobject obj,
603 jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700604 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700605 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700606}
607
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700608void CallVoidMethodA(JNIEnv* env, jobject obj,
609 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}
613
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700614jobject CallNonvirtualObjectMethod(JNIEnv* env,
615 jobject obj, jclass clazz, 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 NULL;
619}
620
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700621jobject CallNonvirtualObjectMethodV(JNIEnv* env,
622 jobject obj, jclass clazz, 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 NULL;
626}
627
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700628jobject CallNonvirtualObjectMethodA(JNIEnv* env,
629 jobject obj, jclass clazz, 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 NULL;
633}
634
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700635jboolean CallNonvirtualBooleanMethod(JNIEnv* env,
636 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700637 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700638 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700639 return JNI_FALSE;
640}
641
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700642jboolean CallNonvirtualBooleanMethodV(JNIEnv* env,
643 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700644 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700645 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700646 return JNI_FALSE;
647}
648
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700649jboolean CallNonvirtualBooleanMethodA(JNIEnv* env,
650 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700651 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700652 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700653 return JNI_FALSE;
654}
655
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700656jbyte CallNonvirtualByteMethod(JNIEnv* env,
657 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700658 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700659 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700660 return 0;
661}
662
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700663jbyte CallNonvirtualByteMethodV(JNIEnv* env,
664 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700665 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700666 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700667 return 0;
668}
669
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700670jbyte CallNonvirtualByteMethodA(JNIEnv* env,
671 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700672 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700673 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700674 return 0;
675}
676
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700677jchar CallNonvirtualCharMethod(JNIEnv* env,
678 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700679 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700680 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700681 return 0;
682}
683
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700684jchar CallNonvirtualCharMethodV(JNIEnv* env,
685 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700686 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700687 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700688 return 0;
689}
690
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700691jchar CallNonvirtualCharMethodA(JNIEnv* env,
692 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700693 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700694 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700695 return 0;
696}
697
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700698jshort CallNonvirtualShortMethod(JNIEnv* env,
699 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700700 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700701 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700702 return 0;
703}
704
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700705jshort CallNonvirtualShortMethodV(JNIEnv* env,
706 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700707 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700708 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700709 return 0;
710}
711
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700712jshort CallNonvirtualShortMethodA(JNIEnv* env,
713 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700714 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700715 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700716 return 0;
717}
718
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700719jint CallNonvirtualIntMethod(JNIEnv* env,
720 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700721 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700722 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700723 return 0;
724}
725
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700726jint CallNonvirtualIntMethodV(JNIEnv* env,
727 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700728 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700729 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700730 return 0;
731}
732
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700733jint CallNonvirtualIntMethodA(JNIEnv* env,
734 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700735 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700736 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700737 return 0;
738}
739
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700740jlong CallNonvirtualLongMethod(JNIEnv* env,
741 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700742 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700743 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700744 return 0;
745}
746
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700747jlong CallNonvirtualLongMethodV(JNIEnv* env,
748 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700749 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700750 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700751 return 0;
752}
753
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700754jlong CallNonvirtualLongMethodA(JNIEnv* env,
755 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700756 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700757 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700758 return 0;
759}
760
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700761jfloat CallNonvirtualFloatMethod(JNIEnv* env,
762 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700763 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700764 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700765 return 0;
766}
767
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700768jfloat CallNonvirtualFloatMethodV(JNIEnv* env,
769 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700770 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700771 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700772 return 0;
773}
774
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700775jfloat CallNonvirtualFloatMethodA(JNIEnv* env,
776 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700777 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700778 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700779 return 0;
780}
781
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700782jdouble CallNonvirtualDoubleMethod(JNIEnv* env,
783 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700784 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700785 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700786 return 0;
787}
788
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700789jdouble CallNonvirtualDoubleMethodV(JNIEnv* env,
790 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700791 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700792 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700793 return 0;
794}
795
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700796jdouble CallNonvirtualDoubleMethodA(JNIEnv* env,
797 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700798 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700799 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700800 return 0;
801}
802
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700803void CallNonvirtualVoidMethod(JNIEnv* env,
804 jobject obj, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700805 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700806 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700807}
808
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700809void CallNonvirtualVoidMethodV(JNIEnv* env,
810 jobject obj, jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700811 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700812 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700813}
814
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700815void CallNonvirtualVoidMethodA(JNIEnv* env,
816 jobject obj, jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700817 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700818 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700819}
820
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700821jfieldID GetFieldID(JNIEnv* env,
822 jclass clazz, const char* name, const char* sig) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700823 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700824 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700825 return NULL;
826}
827
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700828jobject GetObjectField(JNIEnv* env, jobject obj, jfieldID fieldID) {
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 NULL;
832}
833
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700834jboolean GetBooleanField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700835 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700836 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700837 return JNI_FALSE;
838}
839
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700840jbyte GetByteField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700841 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700842 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700843 return 0;
844}
845
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700846jchar GetCharField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700847 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700848 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700849 return 0;
850}
851
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700852jshort GetShortField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700853 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700854 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700855 return 0;
856}
857
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700858jint GetIntField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700859 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700860 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700861 return 0;
862}
863
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700864jlong GetLongField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700865 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700866 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700867 return 0;
868}
869
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700870jfloat GetFloatField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700871 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700872 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700873 return 0;
874}
875
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700876jdouble GetDoubleField(JNIEnv* env, jobject obj, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700877 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700878 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700879 return 0;
880}
881
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700882void SetObjectField(JNIEnv* env, jobject obj, jfieldID fieldID, jobject val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700883 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700884 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700885}
886
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700887void SetBooleanField(JNIEnv* env, jobject obj, jfieldID fieldID, jboolean val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700888 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700889 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700890}
891
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700892void SetByteField(JNIEnv* env, jobject obj, jfieldID fieldID, jbyte val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700893 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700894 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700895}
896
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700897void SetCharField(JNIEnv* env, jobject obj, jfieldID fieldID, jchar val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700898 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700899 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700900}
901
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700902void SetShortField(JNIEnv* env, jobject obj, jfieldID fieldID, jshort val) {
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}
906
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700907void SetIntField(JNIEnv* env, jobject obj, jfieldID fieldID, jint val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700908 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700909 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700910}
911
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700912void SetLongField(JNIEnv* env, jobject obj, jfieldID fieldID, jlong val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700913 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700914 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700915}
916
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700917void SetFloatField(JNIEnv* env, jobject obj, jfieldID fieldID, jfloat val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700918 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700919 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700920}
921
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700922void SetDoubleField(JNIEnv* env, jobject obj, jfieldID fieldID, jdouble val) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700923 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -0700924 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700925}
926
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700927jmethodID GetStaticMethodID(JNIEnv* env,
928 jclass clazz, const char* name, const char* sig) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700929 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -0700930 // TODO: DecodeReference
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700931 Class* klass = reinterpret_cast<Class*>(clazz);
Carl Shapiro83ab4f32011-08-15 20:21:39 -0700932 if (!klass->IsInitialized()) {
933 // TODO: initialize the class
934 }
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700935 Method* method = klass->FindDirectMethod(name, sig);
936 if (method == NULL || !method->IsStatic()) {
Carl Shapiro83ab4f32011-08-15 20:21:39 -0700937 LG << "NoSuchMethodError"; // TODO: throw NoSuchMethodError
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700938 return NULL;
939 }
940 // TODO: create a JNI weak global reference for method
941 bool success = EnsureInvokeStub(method);
942 if (!success) {
943 // TODO: throw OutOfMemoryException
944 return NULL;
945 }
946 return reinterpret_cast<jmethodID>(method);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700947}
948
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700949jobject CallStaticObjectMethod(JNIEnv* env,
950 jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700951 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700952 va_list ap;
953 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700954 JValue result = InvokeWithVarArgs(ts.Self(), NULL, methodID, ap);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -0700955 return AddLocalReference<jobject>(ts, result.l);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700956}
957
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700958jobject CallStaticObjectMethodV(JNIEnv* env,
959 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700960 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700961 JValue result = InvokeWithVarArgs(ts.Self(), NULL, methodID, args);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -0700962 return AddLocalReference<jobject>(ts, result.l);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700963}
964
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700965jobject CallStaticObjectMethodA(JNIEnv* env,
966 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700967 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700968 JValue result = InvokeWithJValues(ts.Self(), NULL, methodID, args);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -0700969 return AddLocalReference<jobject>(ts, result.l);
Carl Shapiroea4dca82011-08-01 13:45:38 -0700970}
971
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700972jboolean CallStaticBooleanMethod(JNIEnv* env,
973 jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700974 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700975 va_list ap;
976 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700977 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).z;
Carl Shapiroea4dca82011-08-01 13:45:38 -0700978}
979
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700980jboolean CallStaticBooleanMethodV(JNIEnv* env,
981 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700982 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700983 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).z;
Carl Shapiroea4dca82011-08-01 13:45:38 -0700984}
985
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700986jboolean CallStaticBooleanMethodA(JNIEnv* env,
987 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700988 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700989 return InvokeWithJValues(ts.Self(), NULL, methodID, args).z;
Carl Shapiroea4dca82011-08-01 13:45:38 -0700990}
991
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700992jbyte CallStaticByteMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -0700993 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -0700994 va_list ap;
995 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -0700996 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).b;
Carl Shapiroea4dca82011-08-01 13:45:38 -0700997}
998
Elliott Hughes40ef99e2011-08-11 17:44:34 -0700999jbyte CallStaticByteMethodV(JNIEnv* env,
1000 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001001 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001002 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).b;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001003}
1004
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001005jbyte CallStaticByteMethodA(JNIEnv* env,
1006 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001007 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001008 return InvokeWithJValues(ts.Self(), NULL, methodID, args).b;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001009}
1010
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001011jchar CallStaticCharMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001012 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001013 va_list ap;
1014 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001015 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).c;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001016}
1017
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001018jchar CallStaticCharMethodV(JNIEnv* env,
1019 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001020 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001021 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).c;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001022}
1023
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001024jchar CallStaticCharMethodA(JNIEnv* env,
1025 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001026 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001027 return InvokeWithJValues(ts.Self(), NULL, methodID, args).c;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001028}
1029
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001030jshort CallStaticShortMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001031 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001032 va_list ap;
1033 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001034 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).s;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001035}
1036
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001037jshort CallStaticShortMethodV(JNIEnv* env,
1038 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001039 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001040 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).s;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001041}
1042
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001043jshort CallStaticShortMethodA(JNIEnv* env,
1044 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001045 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001046 return InvokeWithJValues(ts.Self(), NULL, methodID, args).s;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001047}
1048
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001049jint CallStaticIntMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001050 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001051 va_list ap;
1052 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001053 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).i;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001054}
1055
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001056jint CallStaticIntMethodV(JNIEnv* env,
1057 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001058 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001059 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).i;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001060}
1061
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001062jint CallStaticIntMethodA(JNIEnv* env,
1063 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001064 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001065 return InvokeWithJValues(ts.Self(), NULL, methodID, args).i;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001066}
1067
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001068jlong CallStaticLongMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001069 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001070 va_list ap;
1071 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001072 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).j;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001073}
1074
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001075jlong CallStaticLongMethodV(JNIEnv* env,
1076 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001077 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001078 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).j;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001079}
1080
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001081jlong CallStaticLongMethodA(JNIEnv* env,
1082 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001083 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001084 return InvokeWithJValues(ts.Self(), NULL, methodID, args).j;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001085}
1086
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001087jfloat CallStaticFloatMethod(JNIEnv* env, jclass cls, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001088 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001089 va_list ap;
1090 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001091 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).f;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001092}
1093
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001094jfloat CallStaticFloatMethodV(JNIEnv* env,
1095 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001096 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001097 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).f;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001098}
1099
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001100jfloat CallStaticFloatMethodA(JNIEnv* env,
1101 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001102 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001103 return InvokeWithJValues(ts.Self(), NULL, methodID, args).f;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001104}
1105
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001106jdouble CallStaticDoubleMethod(JNIEnv* env, jclass cls, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001107 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001108 va_list ap;
1109 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001110 return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).d;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001111}
1112
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001113jdouble CallStaticDoubleMethodV(JNIEnv* env,
1114 jclass clazz, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001115 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001116 return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).d;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001117}
1118
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001119jdouble CallStaticDoubleMethodA(JNIEnv* env,
1120 jclass clazz, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001121 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001122 return InvokeWithJValues(ts.Self(), NULL, methodID, args).d;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001123}
1124
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001125void CallStaticVoidMethod(JNIEnv* env, jclass cls, jmethodID methodID, ...) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001126 ScopedJniThreadState ts(env);
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001127 va_list ap;
1128 va_start(ap, methodID);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001129 InvokeWithVarArgs(ts.Self(), NULL, methodID, ap);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001130}
1131
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001132void CallStaticVoidMethodV(JNIEnv* env,
1133 jclass cls, jmethodID methodID, va_list args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001134 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001135 InvokeWithVarArgs(ts.Self(), NULL, methodID, args);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001136}
1137
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001138void CallStaticVoidMethodA(JNIEnv* env,
Carl Shapiro9b9ba282011-08-14 15:30:39 -07001139 jclass cls, jmethodID methodID, jvalue* args) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001140 ScopedJniThreadState ts(env);
Elliott Hughes3cd987f2011-08-15 10:39:47 -07001141 InvokeWithJValues(ts.Self(), NULL, methodID, args);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001142}
1143
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001144jfieldID GetStaticFieldID(JNIEnv* env,
1145 jclass clazz, const char* name, const char* sig) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001146 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001147 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001148 return 0;
1149}
1150
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001151jobject GetStaticObjectField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001152 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001153 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001154 return NULL;
1155}
1156
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001157jboolean GetStaticBooleanField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001158 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001159 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001160 return JNI_FALSE;
1161}
1162
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001163jbyte GetStaticByteField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001164 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001165 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001166 return 0;
1167}
1168
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001169jchar GetStaticCharField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001170 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001171 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001172 return 0;
1173}
1174
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001175jshort GetStaticShortField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001176 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001177 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001178 return 0;
1179}
1180
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001181jint GetStaticIntField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001182 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001183 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001184 return 0;
1185}
1186
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001187jlong GetStaticLongField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001188 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001189 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001190 return 0;
1191}
1192
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001193jfloat GetStaticFloatField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001194 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001195 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001196 return 0;
1197}
1198
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001199jdouble GetStaticDoubleField(JNIEnv* env, jclass clazz, jfieldID fieldID) {
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 -07001205void SetStaticObjectField(JNIEnv* env,
1206 jclass clazz, jfieldID fieldID, jobject value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001207 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001208 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001209}
1210
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001211void SetStaticBooleanField(JNIEnv* env,
1212 jclass clazz, jfieldID fieldID, jboolean value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001213 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001214 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001215}
1216
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001217void SetStaticByteField(JNIEnv* env,
1218 jclass clazz, jfieldID fieldID, jbyte value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001219 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001220 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001221}
1222
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001223void SetStaticCharField(JNIEnv* env,
1224 jclass clazz, jfieldID fieldID, jchar value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001225 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001226 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001227}
1228
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001229void SetStaticShortField(JNIEnv* env,
1230 jclass clazz, jfieldID fieldID, jshort value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001231 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001232 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001233}
1234
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001235void SetStaticIntField(JNIEnv* env,
1236 jclass clazz, jfieldID fieldID, jint value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001237 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001238 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001239}
1240
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001241void SetStaticLongField(JNIEnv* env,
1242 jclass clazz, jfieldID fieldID, jlong value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001243 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001244 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001245}
1246
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001247void SetStaticFloatField(JNIEnv* env,
1248 jclass clazz, jfieldID fieldID, jfloat value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001249 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001250 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001251}
1252
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001253void SetStaticDoubleField(JNIEnv* env,
1254 jclass clazz, jfieldID fieldID, jdouble value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001255 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001256 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001257}
1258
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001259jstring NewString(JNIEnv* env, const jchar* unicode, jsize len) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001260 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001261 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001262 return NULL;
1263}
1264
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001265jsize GetStringLength(JNIEnv* env, jstring str) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001266 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001267 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001268 return 0;
1269}
1270
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001271const jchar* GetStringChars(JNIEnv* env, jstring str, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001272 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001273 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001274 return NULL;
1275}
1276
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001277void ReleaseStringChars(JNIEnv* env, jstring str, const jchar* chars) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001278 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001279 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001280}
1281
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001282jstring NewStringUTF(JNIEnv* env, const char* utf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001283 ScopedJniThreadState ts(env);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001284 if (utf == NULL) {
1285 return NULL;
1286 }
1287 size_t char_count = String::ModifiedUtf8Len(utf);
1288 String* result = String::AllocFromModifiedUtf8(char_count, utf);
1289 return AddLocalReference<jstring>(ts, result);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001290}
1291
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001292jsize GetStringUTFLength(JNIEnv* env, jstring str) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001293 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001294 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001295 return 0;
1296}
1297
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001298const char* GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001299 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001300 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001301 return NULL;
1302}
1303
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001304void ReleaseStringUTFChars(JNIEnv* env, jstring str, const char* chars) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001305 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001306 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001307}
1308
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001309jsize GetArrayLength(JNIEnv* env, jarray array) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001310 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001311 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001312 return 0;
1313}
1314
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001315jobject GetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001316 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001317 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001318 return NULL;
1319}
1320
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001321void SetObjectArrayElement(JNIEnv* env,
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001322 jobjectArray java_array, jsize index, jobject java_value) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001323 ScopedJniThreadState ts(env);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001324 // TODO: DecodeReference
1325 ObjectArray<Object>* array = reinterpret_cast<ObjectArray<Object>*>(java_array);
1326 Object* value = reinterpret_cast<Object*>(java_value);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001327 array->Set(index, value);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001328}
1329
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001330template<typename JniT, typename ArtT>
1331JniT NewPrimitiveArray(ScopedJniThreadState& ts, jsize length) {
1332 CHECK_GE(length, 0); // TODO: ReportJniError
1333 ArtT* result = ArtT::Alloc(length);
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001334 return AddLocalReference<JniT>(ts, result);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001335}
1336
Elliott Hughesf2682d52011-08-15 16:37:04 -07001337jbooleanArray NewBooleanArray(JNIEnv* env, jsize length) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001338 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001339 return NewPrimitiveArray<jbooleanArray, BooleanArray>(ts, length);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001340}
1341
Elliott Hughesf2682d52011-08-15 16:37:04 -07001342jbyteArray NewByteArray(JNIEnv* env, jsize length) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001343 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001344 return NewPrimitiveArray<jbyteArray, ByteArray>(ts, length);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001345}
1346
Elliott Hughesf2682d52011-08-15 16:37:04 -07001347jcharArray NewCharArray(JNIEnv* env, jsize length) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001348 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001349 return NewPrimitiveArray<jcharArray, CharArray>(ts, length);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001350}
1351
Elliott Hughesf2682d52011-08-15 16:37:04 -07001352jdoubleArray NewDoubleArray(JNIEnv* env, jsize length) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001353 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001354 return NewPrimitiveArray<jdoubleArray, DoubleArray>(ts, length);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001355}
1356
Elliott Hughesf2682d52011-08-15 16:37:04 -07001357jfloatArray NewFloatArray(JNIEnv* env, jsize length) {
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001358 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001359 return NewPrimitiveArray<jfloatArray, FloatArray>(ts, length);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001360}
1361
Elliott Hughesf2682d52011-08-15 16:37:04 -07001362jintArray NewIntArray(JNIEnv* env, jsize length) {
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001363 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001364 return NewPrimitiveArray<jintArray, IntArray>(ts, length);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001365}
1366
Elliott Hughesf2682d52011-08-15 16:37:04 -07001367jlongArray NewLongArray(JNIEnv* env, jsize length) {
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001368 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001369 return NewPrimitiveArray<jlongArray, LongArray>(ts, length);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001370}
1371
Elliott Hughesf2682d52011-08-15 16:37:04 -07001372jobjectArray NewObjectArray(JNIEnv* env, jsize length, jclass element_jclass, jobject initial_element) {
Elliott Hughesd8ddfd52011-08-15 14:32:53 -07001373 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001374 CHECK_GE(length, 0); // TODO: ReportJniError
1375
1376 // Compute the array class corresponding to the given element class.
1377 // TODO: DecodeReference
1378 Class* element_class = reinterpret_cast<Class*>(element_jclass);
1379 std::string descriptor;
1380 descriptor += "[";
1381 descriptor += element_class->GetDescriptor().ToString();
1382
1383 // Find the class.
1384 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1385 // TODO: need to get the appropriate ClassLoader.
1386 Class* array_class = class_linker->FindClass(descriptor, NULL);
1387 if (array_class == NULL) {
1388 return NULL;
1389 }
1390
1391 ObjectArray<Object>* result = ObjectArray<Object>::Alloc(array_class, length);
1392 CHECK(initial_element == NULL); // TODO: support initial_element
Elliott Hughes8a26c5c2011-08-15 18:35:43 -07001393 return AddLocalReference<jobjectArray>(ts, result);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001394}
1395
1396jshortArray NewShortArray(JNIEnv* env, jsize length) {
1397 ScopedJniThreadState ts(env);
1398 return NewPrimitiveArray<jshortArray, ShortArray>(ts, length);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001399}
1400
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001401jboolean* GetBooleanArrayElements(JNIEnv* env,
1402 jbooleanArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001403 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001404 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001405 return NULL;
1406}
1407
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001408jbyte* GetByteArrayElements(JNIEnv* env, jbyteArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001409 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001410 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001411 return NULL;
1412}
1413
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001414jchar* GetCharArrayElements(JNIEnv* env, jcharArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001415 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001416 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001417 return NULL;
1418}
1419
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001420jshort* GetShortArrayElements(JNIEnv* env,
1421 jshortArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001422 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001423 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001424 return NULL;
1425}
1426
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001427jint* GetIntArrayElements(JNIEnv* env, jintArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001428 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001429 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001430 return NULL;
1431}
1432
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001433jlong* GetLongArrayElements(JNIEnv* env, jlongArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001434 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001435 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001436 return NULL;
1437}
1438
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001439jfloat* GetFloatArrayElements(JNIEnv* env,
1440 jfloatArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001441 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001442 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001443 return NULL;
1444}
1445
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001446jdouble* GetDoubleArrayElements(JNIEnv* env,
1447 jdoubleArray array, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001448 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001449 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001450 return NULL;
1451}
1452
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001453void ReleaseBooleanArrayElements(JNIEnv* env,
1454 jbooleanArray array, jboolean* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001455 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001456 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001457}
1458
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001459void ReleaseByteArrayElements(JNIEnv* env,
1460 jbyteArray array, jbyte* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001461 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001462 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001463}
1464
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001465void ReleaseCharArrayElements(JNIEnv* env,
1466 jcharArray array, jchar* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001467 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001468 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001469}
1470
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001471void ReleaseShortArrayElements(JNIEnv* env,
1472 jshortArray array, jshort* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001473 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001474 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001475}
1476
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001477void ReleaseIntArrayElements(JNIEnv* env,
1478 jintArray array, jint* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001479 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001480 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001481}
1482
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001483void ReleaseLongArrayElements(JNIEnv* env,
1484 jlongArray array, jlong* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001485 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001486 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001487}
1488
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001489void ReleaseFloatArrayElements(JNIEnv* env,
1490 jfloatArray array, jfloat* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001491 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001492 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001493}
1494
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001495void ReleaseDoubleArrayElements(JNIEnv* env,
1496 jdoubleArray array, jdouble* elems, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001497 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001498 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001499}
1500
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001501void GetBooleanArrayRegion(JNIEnv* env,
1502 jbooleanArray array, jsize start, jsize l, jboolean* buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001503 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001504 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001505}
1506
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001507void GetByteArrayRegion(JNIEnv* env,
1508 jbyteArray array, jsize start, jsize len, jbyte* buf) {
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 GetCharArrayRegion(JNIEnv* env,
1514 jcharArray array, jsize start, jsize len, jchar* buf) {
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 GetShortArrayRegion(JNIEnv* env,
1520 jshortArray array, jsize start, jsize len, jshort* buf) {
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 GetIntArrayRegion(JNIEnv* env,
1526 jintArray array, jsize start, jsize len, jint* buf) {
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 GetLongArrayRegion(JNIEnv* env,
1532 jlongArray array, jsize start, jsize len, jlong* buf) {
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 GetFloatArrayRegion(JNIEnv* env,
1538 jfloatArray array, jsize start, jsize len, jfloat* buf) {
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 GetDoubleArrayRegion(JNIEnv* env,
1544 jdoubleArray array, jsize start, jsize len, jdouble* buf) {
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 SetBooleanArrayRegion(JNIEnv* env,
1550 jbooleanArray array, jsize start, jsize l, const jboolean* buf) {
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 SetByteArrayRegion(JNIEnv* env,
1556 jbyteArray array, jsize start, jsize len, const jbyte* 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 SetCharArrayRegion(JNIEnv* env,
1562 jcharArray array, jsize start, jsize len, const jchar* 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 SetShortArrayRegion(JNIEnv* env,
1568 jshortArray array, jsize start, jsize len, const jshort* 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 SetIntArrayRegion(JNIEnv* env,
1574 jintArray array, jsize start, jsize len, const jint* 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 SetLongArrayRegion(JNIEnv* env,
1580 jlongArray array, jsize start, jsize len, const jlong* 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 SetFloatArrayRegion(JNIEnv* env,
1586 jfloatArray array, jsize start, jsize len, const jfloat* 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 SetDoubleArrayRegion(JNIEnv* env,
1592 jdoubleArray array, jsize start, jsize len, const jdouble* 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 -07001597jint RegisterNatives(JNIEnv* env,
1598 jclass clazz, const JNINativeMethod* methods, jint nMethods) {
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 return 0;
1602}
1603
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001604jint UnregisterNatives(JNIEnv* env, jclass clazz) {
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 return 0;
1608}
1609
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001610jint MonitorEnter(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001611 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001612 UNIMPLEMENTED(WARNING);
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001613 return 0;
1614}
1615
1616jint MonitorExit(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001617 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001618 UNIMPLEMENTED(WARNING);
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001619 return 0;
1620}
1621
Elliott Hughesb20a5542011-08-12 18:03:12 -07001622jint GetJavaVM(JNIEnv* env, JavaVM** vm) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001623 ScopedJniThreadState ts(env);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001624 Runtime* runtime = Runtime::Current();
1625 if (runtime != NULL) {
1626 *vm = runtime->GetJavaVM();
1627 } else {
1628 *vm = NULL;
1629 }
1630 return (*vm != NULL) ? JNI_OK : JNI_ERR;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001631}
1632
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001633void GetStringRegion(JNIEnv* env,
1634 jstring str, jsize start, jsize len, jchar* 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 GetStringUTFRegion(JNIEnv* env,
1640 jstring str, jsize start, jsize len, char* 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* GetPrimitiveArrayCritical(JNIEnv* env,
1646 jarray array, jboolean* isCopy) {
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 return NULL;
1650}
1651
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001652void ReleasePrimitiveArrayCritical(JNIEnv* env,
1653 jarray array, void* carray, jint mode) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001654 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001655 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001656}
1657
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001658const jchar* GetStringCritical(JNIEnv* env, jstring s, jboolean* isCopy) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001659 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001660 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001661 return NULL;
1662}
1663
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001664void ReleaseStringCritical(JNIEnv* env, jstring s, const jchar* cstr) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001665 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001666 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001667}
1668
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001669jweak NewWeakGlobalRef(JNIEnv* env, jobject obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001670 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001671 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001672 return NULL;
1673}
1674
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001675void DeleteWeakGlobalRef(JNIEnv* env, jweak obj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001676 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001677 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001678}
1679
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001680jboolean ExceptionCheck(JNIEnv* env) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001681 ScopedJniThreadState ts(env);
Elliott Hughesb20a5542011-08-12 18:03:12 -07001682 return ts.Self()->IsExceptionPending() ? JNI_TRUE : JNI_FALSE;
Carl Shapiroea4dca82011-08-01 13:45:38 -07001683}
1684
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001685jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity) {
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 NULL;
1689}
1690
1691
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001692void* GetDirectBufferAddress(JNIEnv* env, jobject buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001693 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001694 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001695 return NULL;
1696}
1697
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001698jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001699 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001700 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001701 return 0;
1702}
1703
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001704jobjectRefType GetObjectRefType(JNIEnv* env, jobject jobj) {
Elliott Hughes22f40932011-08-12 13:06:37 -07001705 ScopedJniThreadState ts(env);
Elliott Hughesc7ac37f2011-08-12 12:21:58 -07001706 UNIMPLEMENTED(FATAL);
Carl Shapiroea4dca82011-08-01 13:45:38 -07001707 return JNIInvalidRefType;
1708}
1709
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001710static const struct JNINativeInterface gNativeInterface = {
Carl Shapiroea4dca82011-08-01 13:45:38 -07001711 NULL, // reserved0.
1712 NULL, // reserved1.
1713 NULL, // reserved2.
1714 NULL, // reserved3.
1715 GetVersion,
1716 DefineClass,
1717 FindClass,
1718 FromReflectedMethod,
1719 FromReflectedField,
1720 ToReflectedMethod,
1721 GetSuperclass,
1722 IsAssignableFrom,
1723 ToReflectedField,
1724 Throw,
1725 ThrowNew,
1726 ExceptionOccurred,
1727 ExceptionDescribe,
1728 ExceptionClear,
1729 FatalError,
1730 PushLocalFrame,
1731 PopLocalFrame,
1732 NewGlobalRef,
1733 DeleteGlobalRef,
1734 DeleteLocalRef,
1735 IsSameObject,
1736 NewLocalRef,
1737 EnsureLocalCapacity,
1738 AllocObject,
1739 NewObject,
1740 NewObjectV,
1741 NewObjectA,
1742 GetObjectClass,
1743 IsInstanceOf,
1744 GetMethodID,
1745 CallObjectMethod,
1746 CallObjectMethodV,
1747 CallObjectMethodA,
1748 CallBooleanMethod,
1749 CallBooleanMethodV,
1750 CallBooleanMethodA,
1751 CallByteMethod,
1752 CallByteMethodV,
1753 CallByteMethodA,
1754 CallCharMethod,
1755 CallCharMethodV,
1756 CallCharMethodA,
1757 CallShortMethod,
1758 CallShortMethodV,
1759 CallShortMethodA,
1760 CallIntMethod,
1761 CallIntMethodV,
1762 CallIntMethodA,
1763 CallLongMethod,
1764 CallLongMethodV,
1765 CallLongMethodA,
1766 CallFloatMethod,
1767 CallFloatMethodV,
1768 CallFloatMethodA,
1769 CallDoubleMethod,
1770 CallDoubleMethodV,
1771 CallDoubleMethodA,
1772 CallVoidMethod,
1773 CallVoidMethodV,
1774 CallVoidMethodA,
1775 CallNonvirtualObjectMethod,
1776 CallNonvirtualObjectMethodV,
1777 CallNonvirtualObjectMethodA,
1778 CallNonvirtualBooleanMethod,
1779 CallNonvirtualBooleanMethodV,
1780 CallNonvirtualBooleanMethodA,
1781 CallNonvirtualByteMethod,
1782 CallNonvirtualByteMethodV,
1783 CallNonvirtualByteMethodA,
1784 CallNonvirtualCharMethod,
1785 CallNonvirtualCharMethodV,
1786 CallNonvirtualCharMethodA,
1787 CallNonvirtualShortMethod,
1788 CallNonvirtualShortMethodV,
1789 CallNonvirtualShortMethodA,
1790 CallNonvirtualIntMethod,
1791 CallNonvirtualIntMethodV,
1792 CallNonvirtualIntMethodA,
1793 CallNonvirtualLongMethod,
1794 CallNonvirtualLongMethodV,
1795 CallNonvirtualLongMethodA,
1796 CallNonvirtualFloatMethod,
1797 CallNonvirtualFloatMethodV,
1798 CallNonvirtualFloatMethodA,
1799 CallNonvirtualDoubleMethod,
1800 CallNonvirtualDoubleMethodV,
1801 CallNonvirtualDoubleMethodA,
1802 CallNonvirtualVoidMethod,
1803 CallNonvirtualVoidMethodV,
1804 CallNonvirtualVoidMethodA,
1805 GetFieldID,
1806 GetObjectField,
1807 GetBooleanField,
1808 GetByteField,
1809 GetCharField,
1810 GetShortField,
1811 GetIntField,
1812 GetLongField,
1813 GetFloatField,
1814 GetDoubleField,
1815 SetObjectField,
1816 SetBooleanField,
1817 SetByteField,
1818 SetCharField,
1819 SetShortField,
1820 SetIntField,
1821 SetLongField,
1822 SetFloatField,
1823 SetDoubleField,
1824 GetStaticMethodID,
1825 CallStaticObjectMethod,
1826 CallStaticObjectMethodV,
1827 CallStaticObjectMethodA,
1828 CallStaticBooleanMethod,
1829 CallStaticBooleanMethodV,
1830 CallStaticBooleanMethodA,
1831 CallStaticByteMethod,
1832 CallStaticByteMethodV,
1833 CallStaticByteMethodA,
1834 CallStaticCharMethod,
1835 CallStaticCharMethodV,
1836 CallStaticCharMethodA,
1837 CallStaticShortMethod,
1838 CallStaticShortMethodV,
1839 CallStaticShortMethodA,
1840 CallStaticIntMethod,
1841 CallStaticIntMethodV,
1842 CallStaticIntMethodA,
1843 CallStaticLongMethod,
1844 CallStaticLongMethodV,
1845 CallStaticLongMethodA,
1846 CallStaticFloatMethod,
1847 CallStaticFloatMethodV,
1848 CallStaticFloatMethodA,
1849 CallStaticDoubleMethod,
1850 CallStaticDoubleMethodV,
1851 CallStaticDoubleMethodA,
1852 CallStaticVoidMethod,
1853 CallStaticVoidMethodV,
1854 CallStaticVoidMethodA,
1855 GetStaticFieldID,
1856 GetStaticObjectField,
1857 GetStaticBooleanField,
1858 GetStaticByteField,
1859 GetStaticCharField,
1860 GetStaticShortField,
1861 GetStaticIntField,
1862 GetStaticLongField,
1863 GetStaticFloatField,
1864 GetStaticDoubleField,
1865 SetStaticObjectField,
1866 SetStaticBooleanField,
1867 SetStaticByteField,
1868 SetStaticCharField,
1869 SetStaticShortField,
1870 SetStaticIntField,
1871 SetStaticLongField,
1872 SetStaticFloatField,
1873 SetStaticDoubleField,
1874 NewString,
1875 GetStringLength,
1876 GetStringChars,
1877 ReleaseStringChars,
1878 NewStringUTF,
1879 GetStringUTFLength,
1880 GetStringUTFChars,
1881 ReleaseStringUTFChars,
1882 GetArrayLength,
1883 NewObjectArray,
1884 GetObjectArrayElement,
1885 SetObjectArrayElement,
1886 NewBooleanArray,
1887 NewByteArray,
1888 NewCharArray,
1889 NewShortArray,
1890 NewIntArray,
1891 NewLongArray,
1892 NewFloatArray,
1893 NewDoubleArray,
1894 GetBooleanArrayElements,
1895 GetByteArrayElements,
1896 GetCharArrayElements,
1897 GetShortArrayElements,
1898 GetIntArrayElements,
1899 GetLongArrayElements,
1900 GetFloatArrayElements,
1901 GetDoubleArrayElements,
1902 ReleaseBooleanArrayElements,
1903 ReleaseByteArrayElements,
1904 ReleaseCharArrayElements,
1905 ReleaseShortArrayElements,
1906 ReleaseIntArrayElements,
1907 ReleaseLongArrayElements,
1908 ReleaseFloatArrayElements,
1909 ReleaseDoubleArrayElements,
1910 GetBooleanArrayRegion,
1911 GetByteArrayRegion,
1912 GetCharArrayRegion,
1913 GetShortArrayRegion,
1914 GetIntArrayRegion,
1915 GetLongArrayRegion,
1916 GetFloatArrayRegion,
1917 GetDoubleArrayRegion,
1918 SetBooleanArrayRegion,
1919 SetByteArrayRegion,
1920 SetCharArrayRegion,
1921 SetShortArrayRegion,
1922 SetIntArrayRegion,
1923 SetLongArrayRegion,
1924 SetFloatArrayRegion,
1925 SetDoubleArrayRegion,
1926 RegisterNatives,
1927 UnregisterNatives,
1928 MonitorEnter,
1929 MonitorExit,
1930 GetJavaVM,
1931 GetStringRegion,
1932 GetStringUTFRegion,
1933 GetPrimitiveArrayCritical,
1934 ReleasePrimitiveArrayCritical,
1935 GetStringCritical,
1936 ReleaseStringCritical,
1937 NewWeakGlobalRef,
1938 DeleteWeakGlobalRef,
1939 ExceptionCheck,
1940 NewDirectByteBuffer,
1941 GetDirectBufferAddress,
1942 GetDirectBufferCapacity,
1943 GetObjectRefType,
1944};
1945
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001946void MonitorEnterHelper(JNIEnv* env, jobject obj) {
Elliott Hughes330304d2011-08-12 14:28:05 -07001947 CHECK_EQ(Thread::Current()->GetJniEnv(), env);
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001948 MonitorEnter(env, obj); // Ignore the result.
1949}
1950
1951void MonitorExitHelper(JNIEnv* env, jobject obj) {
Elliott Hughes330304d2011-08-12 14:28:05 -07001952 CHECK_EQ(Thread::Current()->GetJniEnv(), env);
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001953 MonitorExit(env, obj); // Ignore the result.
1954}
1955
1956JNIEnv* CreateJNIEnv() {
Elliott Hughes330304d2011-08-12 14:28:05 -07001957 Thread* self = Thread::Current();
1958 CHECK(self != NULL);
Elliott Hughesf2682d52011-08-15 16:37:04 -07001959 JNIEnvExt* result = new JNIEnvExt;
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001960 result->fns = &gNativeInterface;
Elliott Hughes330304d2011-08-12 14:28:05 -07001961 result->self = self;
Elliott Hughesf2682d52011-08-15 16:37:04 -07001962 result->critical = false;
Elliott Hughes40ef99e2011-08-11 17:44:34 -07001963 result->MonitorEnterHelper = &MonitorEnterHelper;
1964 result->MonitorExitHelper = &MonitorExitHelper;
1965 return reinterpret_cast<JNIEnv*>(result);
1966}
1967
Carl Shapiroea4dca82011-08-01 13:45:38 -07001968// JNI Invocation interface.
1969
Carl Shapiro2ed144c2011-07-26 16:52:08 -07001970extern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, void** p_env, void* vm_args) {
1971 const JavaVMInitArgs* args = static_cast<JavaVMInitArgs*>(vm_args);
1972 if (args->version < JNI_VERSION_1_2) {
1973 return JNI_EVERSION;
1974 }
1975 Runtime::Options options;
1976 for (int i = 0; i < args->nOptions; ++i) {
1977 JavaVMOption* option = &args->options[i];
Carl Shapirofc322c72011-07-27 00:20:01 -07001978 options.push_back(std::make_pair(StringPiece(option->optionString),
1979 option->extraInfo));
Carl Shapiro2ed144c2011-07-26 16:52:08 -07001980 }
1981 bool ignore_unrecognized = args->ignoreUnrecognized;
Elliott Hughesf2682d52011-08-15 16:37:04 -07001982 Runtime* runtime = Runtime::Create(options, ignore_unrecognized);
Carl Shapiro2ed144c2011-07-26 16:52:08 -07001983 if (runtime == NULL) {
1984 return JNI_ERR;
1985 } else {
1986 *p_env = reinterpret_cast<JNIEnv*>(Thread::Current()->GetJniEnv());
Elliott Hughesf2682d52011-08-15 16:37:04 -07001987 *p_vm = runtime->GetJavaVM();
Carl Shapiro2ed144c2011-07-26 16:52:08 -07001988 return JNI_OK;
1989 }
1990}
1991
Elliott Hughesf2682d52011-08-15 16:37:04 -07001992extern "C" jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize, jsize* vm_count) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07001993 Runtime* runtime = Runtime::Current();
1994 if (runtime == NULL) {
Elliott Hughesf2682d52011-08-15 16:37:04 -07001995 *vm_count = 0;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07001996 } else {
Elliott Hughesf2682d52011-08-15 16:37:04 -07001997 *vm_count = 1;
1998 vms[0] = runtime->GetJavaVM();
Carl Shapiro2ed144c2011-07-26 16:52:08 -07001999 }
2000 return JNI_OK;
2001}
2002
2003// Historically unsupported.
2004extern "C" jint JNI_GetDefaultJavaVMInitArgs(void* vm_args) {
2005 return JNI_ERR;
2006}
2007
Elliott Hughesf2682d52011-08-15 16:37:04 -07002008jint DestroyJavaVM(JavaVM* vm) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002009 if (vm == NULL) {
2010 return JNI_ERR;
2011 } else {
Elliott Hughesf2682d52011-08-15 16:37:04 -07002012 JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
2013 delete raw_vm->runtime;
2014 raw_vm->runtime = NULL;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002015 return JNI_OK;
2016 }
2017}
2018
Elliott Hughesf2682d52011-08-15 16:37:04 -07002019jint AttachCurrentThread(JavaVM* vm, JNIEnv** p_env, void* thr_args) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002020 if (vm == NULL || p_env == NULL) {
2021 return JNI_ERR;
2022 }
Elliott Hughesf2682d52011-08-15 16:37:04 -07002023 JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
2024 Runtime* runtime = raw_vm->runtime;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002025 const char* name = NULL;
2026 if (thr_args != NULL) {
2027 // TODO: check version
2028 name = static_cast<JavaVMAttachArgs*>(thr_args)->name;
2029 // TODO: thread group
2030 }
Elliott Hughes40ef99e2011-08-11 17:44:34 -07002031 bool success = runtime->AttachCurrentThread(name, p_env);
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002032 if (!success) {
2033 return JNI_ERR;
2034 } else {
2035 return JNI_OK;
2036 }
2037}
2038
Elliott Hughesf2682d52011-08-15 16:37:04 -07002039jint DetachCurrentThread(JavaVM* vm) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002040 if (vm == NULL) {
2041 return JNI_ERR;
2042 } else {
Elliott Hughesf2682d52011-08-15 16:37:04 -07002043 JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
2044 Runtime* runtime = raw_vm->runtime;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002045 runtime->DetachCurrentThread();
2046 return JNI_OK;
2047 }
2048}
2049
Elliott Hughesf2682d52011-08-15 16:37:04 -07002050jint GetEnv(JavaVM* vm, void** env, jint version) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002051 if (version < JNI_VERSION_1_1 || version > JNI_VERSION_1_6) {
2052 return JNI_EVERSION;
2053 }
2054 if (vm == NULL || env == NULL) {
2055 return JNI_ERR;
2056 }
2057 Thread* thread = Thread::Current();
2058 if (thread == NULL) {
2059 *env = NULL;
2060 return JNI_EDETACHED;
2061 }
2062 *env = thread->GetJniEnv();
2063 return JNI_OK;
2064}
2065
Elliott Hughesf2682d52011-08-15 16:37:04 -07002066jint AttachCurrentThreadAsDaemon(JavaVM* vm, JNIEnv** p_env, void* thr_args) {
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002067 if (vm == NULL || p_env == NULL) {
2068 return JNI_ERR;
2069 }
Elliott Hughesf2682d52011-08-15 16:37:04 -07002070 JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
2071 Runtime* runtime = raw_vm->runtime;
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002072 const char* name = NULL;
2073 if (thr_args != NULL) {
2074 // TODO: check version
2075 name = static_cast<JavaVMAttachArgs*>(thr_args)->name;
2076 // TODO: thread group
2077 }
Elliott Hughes40ef99e2011-08-11 17:44:34 -07002078 bool success = runtime->AttachCurrentThreadAsDaemon(name, p_env);
Carl Shapiro2ed144c2011-07-26 16:52:08 -07002079 if (!success) {
2080 return JNI_ERR;
2081 } else {
2082 return JNI_OK;
2083 }
2084}
2085
Elliott Hughesf2682d52011-08-15 16:37:04 -07002086struct JNIInvokeInterface gInvokeInterface = {
Carl Shapiroea4dca82011-08-01 13:45:38 -07002087 NULL, // reserved0
2088 NULL, // reserved1
2089 NULL, // reserved2
2090 DestroyJavaVM,
2091 AttachCurrentThread,
2092 DetachCurrentThread,
2093 GetEnv,
2094 AttachCurrentThreadAsDaemon
2095};
2096
Elliott Hughesf2682d52011-08-15 16:37:04 -07002097JavaVM* CreateJavaVM(Runtime* runtime) {
2098 JavaVMExt* result = new JavaVMExt;
2099 result->fns = &gInvokeInterface;
2100 result->runtime = runtime;
2101 return reinterpret_cast<JavaVM*>(result);
2102}
2103
Ian Rogersdf20fe02011-07-20 20:34:16 -07002104} // namespace art