Skip to content

Commit 6f3c1b7

Browse files
committed
Updates to internal APIs
Update APIs for Speed
1 parent 7e487dc commit 6f3c1b7

15 files changed

+459
-1877
lines changed

RemoteInput/JVM.cxx

+52-1,329
Large diffs are not rendered by default.

RemoteInput/JVM.hxx

+1-235
Large diffs are not rendered by default.

RemoteInput/Platform/Platform.hxx

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include "Reflection.hxx"
1010

1111
void GetDesktopResolution(int &width, int &height) noexcept;
12-
Reflection* GetNativeReflector() noexcept;
12+
std::unique_ptr<Reflection> GetNativeReflector() noexcept;
1313

1414
std::int32_t GetCurrentThreadID() noexcept;
1515

RemoteInput/Platform/Platform_Darwin.mm

+37-16
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ bool IsThreadAlive(std::int32_t tid) noexcept
130130
{
131131
std::vector<std::int32_t> result;
132132
std::vector<std::int32_t> pids = get_pids(process_name);
133+
133134
for (std::int32_t pid : pids)
134135
{
135136
if (InjectProcess(pid) != -1)
@@ -226,7 +227,7 @@ @interface NSView (MDRecursiveSubviews)
226227
- (jobject)awtComponent:(JNIEnv*)env;
227228
@end
228229

229-
Reflection* GetNativeReflector() noexcept
230+
std::unique_ptr<Reflection> GetNativeReflector() noexcept
230231
{
231232
// auto ModuleLoaded = [](std::string name) -> bool {
232233
// void* lib = dlopen(name.c_str(), RTLD_GLOBAL | RTLD_NOLOAD);
@@ -256,8 +257,11 @@ - (jobject)awtComponent:(JNIEnv*)env;
256257
// return nullptr;
257258
// }
258259

259-
auto IsValidFrame = [&](Reflection* reflection, jobject object) -> bool {
260-
return reflection->IsDecendentOf(object, "java/awt/Frame");
260+
auto IsValidFrame = [](JNIEnv* env, jobject object) -> bool {
261+
jclass cls = env->FindClass("java/awt/Frame");
262+
bool result = env->IsInstanceOf(object, cls);
263+
env->DeleteLocalRef(cls);
264+
return result;
261265
};
262266

263267
auto GetWindowViews = [&]() -> std::vector<NSView*> {
@@ -281,12 +285,12 @@ - (jobject)awtComponent:(JNIEnv*)env;
281285
return nullptr;
282286
}
283287

284-
Reflection* reflection = new Reflection();
285-
286-
if (reflection->Attach())
288+
JVM vm = JVM();
289+
JNIEnv* env = nullptr;
290+
if (vm.AttachCurrentThread(&env) == JNI_OK)
287291
{
292+
std::unique_ptr<Reflection> reflection;
288293
auto hasReflection = TimeOut(20, [&]{
289-
JNIEnv* env = reflection->getEnv();
290294
jclass cls = env->FindClass("java/awt/Frame");
291295
if (!cls)
292296
{
@@ -300,6 +304,8 @@ - (jobject)awtComponent:(JNIEnv*)env;
300304
}
301305

302306
jobjectArray frames = static_cast<jobjectArray>(env->CallStaticObjectMethod(cls, method));
307+
env->DeleteLocalRef(cls);
308+
303309
if (!frames)
304310
{
305311
return false;
@@ -309,38 +315,53 @@ - (jobject)awtComponent:(JNIEnv*)env;
309315
for (jsize i = 0; i < size; ++i)
310316
{
311317
jobject frame = env->GetObjectArrayElement(frames, i);
312-
if (IsValidFrame(reflection, frame) && reflection->Initialize(frame))
318+
if (frame)
313319
{
314-
return true;
320+
if (IsValidFrame(env, frame))
321+
{
322+
reflection = Reflection::Create(frame);
323+
if (reflection)
324+
{
325+
env->DeleteLocalRef(frames);
326+
return true;
327+
}
328+
}
329+
330+
env->DeleteLocalRef(frame);
315331
}
316332
}
317333

334+
env->DeleteLocalRef(frames);
318335
return false;
319336
});
320337

321338
auto hasReflection2 = TimeOut(20, [&]{
322339
for (auto&& view : GetWindowViews())
323340
{
324341
//TODO: Check if we can call "awt_GetComponent" from the JDK like on Linux
325-
jobject object = [view awtComponent:reflection->getEnv()]; //java.awt.Frame
326-
if (IsValidFrame(reflection, object) && reflection->Initialize(object))
342+
jobject frame = [view awtComponent:env]; //java.awt.Frame
343+
if (frame)
327344
{
328-
return true;
345+
if (IsValidFrame(env, frame))
346+
{
347+
reflection = Reflection::Create(frame);
348+
if (reflection)
349+
{
350+
return true;
351+
}
352+
}
329353
}
330354
}
331355
return false;
332356
});
333357

334358
if (hasReflection || hasReflection2)
335359
{
336-
reflection->Detach();
337360
return reflection;
338361
}
339-
340-
reflection->Detach();
341362
}
342363

343-
delete reflection;
364+
vm.DetachCurrentThread();
344365
return nullptr;
345366
}
346367

RemoteInput/Platform/Platform_Linux.cxx

+43-14
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ bool EnumWindowsProc(Display* display, Window window, void* other) noexcept
490490
return true;
491491
}
492492

493-
Reflection* GetNativeReflector() noexcept
493+
std::unique_ptr<Reflection> GetNativeReflector() noexcept
494494
{
495495
auto ModuleLoaded = [](std::string name) -> bool {
496496
void* lib = dlopen(name.c_str(), RTLD_LAZY | RTLD_NOLOAD);
@@ -516,8 +516,11 @@ Reflection* GetNativeReflector() noexcept
516516
return true;
517517
};
518518

519-
auto IsValidFrame = [&](Reflection* reflection, jobject object) -> bool {
520-
return reflection->IsDecendentOf(object, "java/awt/Frame");
519+
auto IsValidFrame = [](JNIEnv* env, jobject object) -> bool {
520+
jclass cls = env->FindClass("java/awt/Frame");
521+
bool result = env->IsInstanceOf(object, cls);
522+
env->DeleteLocalRef(cls);
523+
return result;
521524
};
522525

523526
if (!TimeOut(5, [&]{ return JVM().getVM() != nullptr; }))
@@ -537,11 +540,17 @@ Reflection* GetNativeReflector() noexcept
537540
return 0;
538541
};
539542

540-
Reflection* reflection = new Reflection();
541-
if (reflection->Attach())
543+
JVM vm = JVM();
544+
if (!vm)
542545
{
546+
return nullptr;
547+
}
548+
549+
JNIEnv* env = nullptr;
550+
if (vm.AttachCurrentThread(&env) == JNI_OK)
551+
{
552+
std::unique_ptr<Reflection> reflection;
543553
auto hasReflection = TimeOut(20, [&]{
544-
JNIEnv* env = reflection->getEnv();
545554
jclass cls = env->FindClass("java/awt/Frame");
546555
if (!cls)
547556
{
@@ -555,6 +564,7 @@ Reflection* GetNativeReflector() noexcept
555564
}
556565

557566
jobjectArray frames = static_cast<jobjectArray>(env->CallStaticObjectMethod(cls, method));
567+
env->DeleteLocalRef(cls);
558568
if (!frames)
559569
{
560570
return false;
@@ -564,11 +574,23 @@ Reflection* GetNativeReflector() noexcept
564574
for (jsize i = 0; i < size; ++i)
565575
{
566576
jobject frame = env->GetObjectArrayElement(frames, i);
567-
if (IsValidFrame(reflection, frame) && reflection->Initialize(frame))
577+
if (frame)
568578
{
569-
return true;
579+
if (IsValidFrame(env, frame))
580+
{
581+
reflection = Reflection::Create(frame);
582+
if (reflection)
583+
{
584+
env->DeleteLocalRef(frames);
585+
return true;
586+
}
587+
}
588+
589+
env->DeleteLocalRef(frame);
570590
}
571591
}
592+
593+
env->DeleteLocalRef(frames);
572594
return false;
573595
});
574596

@@ -588,23 +610,30 @@ Reflection* GetNativeReflector() noexcept
588610
void* windowFrame = reinterpret_cast<void*>(GetMainWindow());
589611
if (windowFrame)
590612
{
591-
jobject object = awt_GetComponent(reflection->getEnv(), windowFrame); //java.awt.Frame
592-
return IsValidFrame(reflection, object) && reflection->Initialize(object);
613+
jobject frame = awt_GetComponent(reflection->getEnv(), windowFrame); //java.awt.Frame
614+
if (frame)
615+
{
616+
if (IsValidFrame(env, frame))
617+
{
618+
reflection = Reflection::Create(frame);
619+
if (reflection)
620+
{
621+
return true;
622+
}
623+
}
624+
}
593625
}
594626
return false;
595627
});
596628
});
597629

598630
if (hasReflection || hasReflection2)
599631
{
600-
reflection->Detach();
601632
return reflection;
602633
}
603-
604-
reflection->Detach();
605634
}
606635

607-
delete reflection;
636+
vm.DetachCurrentThread();
608637
return nullptr;
609638
}
610639
#endif // defined

RemoteInput/Platform/Platform_Windows.cxx

+41-14
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) noexcept
337337
return TRUE;
338338
}
339339

340-
Reflection* GetNativeReflector() noexcept
340+
std::unique_ptr<Reflection> GetNativeReflector() noexcept
341341
{
342342
auto TimeOut = [&](std::uint32_t time, std::function<bool()> &&run) -> bool {
343343
auto start = std::chrono::high_resolution_clock::now();
@@ -353,8 +353,11 @@ Reflection* GetNativeReflector() noexcept
353353
return true;
354354
};
355355

356-
auto IsValidFrame = [&](Reflection* reflection, jobject object) -> bool {
357-
return reflection->IsDecendentOf(object, "java/awt/Frame");
356+
auto IsValidFrame = [](JNIEnv* env, jobject object) -> bool {
357+
jclass cls = env->FindClass("java/awt/Frame");
358+
bool result = env->IsInstanceOf(object, cls);
359+
env->DeleteLocalRef(cls);
360+
return result;
358361
};
359362

360363
auto GetMainWindow = [&] {
@@ -374,12 +377,17 @@ Reflection* GetNativeReflector() noexcept
374377
return nullptr;
375378
}
376379

377-
Reflection* reflection = new Reflection();
380+
JVM vm = JVM();
381+
if (!vm)
382+
{
383+
return nullptr;
384+
}
378385

379-
if (reflection->Attach())
386+
JNIEnv* env = nullptr;
387+
if (vm.AttachCurrentThread(&env) == JNI_OK)
380388
{
389+
std::unique_ptr<Reflection> reflection;
381390
auto hasReflection = TimeOut(20, [&]{
382-
JNIEnv* env = reflection->getEnv();
383391
jclass cls = env->FindClass("java/awt/Frame");
384392
if (!cls)
385393
{
@@ -393,6 +401,7 @@ Reflection* GetNativeReflector() noexcept
393401
}
394402

395403
jobjectArray frames = static_cast<jobjectArray>(env->CallStaticObjectMethod(cls, method));
404+
env->DeleteLocalRef(cls);
396405
if (!frames)
397406
{
398407
return false;
@@ -402,12 +411,23 @@ Reflection* GetNativeReflector() noexcept
402411
for (jsize i = 0; i < size; ++i)
403412
{
404413
jobject frame = env->GetObjectArrayElement(frames, i);
405-
if (IsValidFrame(reflection, frame) && reflection->Initialize(frame))
414+
if (frame)
406415
{
407-
return true;
416+
if (IsValidFrame(env, frame))
417+
{
418+
reflection = Reflection::Create(frame);
419+
if (reflection)
420+
{
421+
env->DeleteLocalRef(frames);
422+
return true;
423+
}
424+
}
425+
426+
env->DeleteLocalRef(frame);
408427
}
409428
}
410429

430+
env->DeleteLocalRef(frames);
411431
return false;
412432
});
413433

@@ -434,23 +454,30 @@ Reflection* GetNativeReflector() noexcept
434454
HWND windowFrame = GetMainWindow();
435455
if (windowFrame)
436456
{
437-
jobject object = DSGetComponent(reflection->getEnv(), windowFrame); //java.awt.Frame
438-
return IsValidFrame(reflection, object) && reflection->Initialize(object);
457+
jobject frame = DSGetComponent(reflection->getEnv(), windowFrame); //java.awt.Frame
458+
if (frame)
459+
{
460+
if (IsValidFrame(env, frame))
461+
{
462+
reflection = Reflection::Create(frame);
463+
if (reflection)
464+
{
465+
return true;
466+
}
467+
}
468+
}
439469
}
440470
return false;
441471
});
442472
});
443473

444474
if (hasReflection || hasReflection2)
445475
{
446-
reflection->Detach();
447476
return reflection;
448477
}
449-
450-
reflection->Detach();
451478
}
452479

453-
delete reflection;
480+
vm.DetachCurrentThread();
454481
return nullptr;
455482
}
456483
#endif // defined

0 commit comments

Comments
 (0)