Skip to content

Commit 5b83139

Browse files
[Mono.Android] treat AllocObjectSupported as always true (#9146)
This removes an API < 10 code path, which should speed up all `JNIEnv.StartCreateInstance` / `FinishCreateInstance` calls by a very small amount. They no longer check a `AllocObjectSupported` field, which is now always `true`. This also removes the need to pass in `androidSdkVersion` / `android_api_level` from the native side at startup. We can also remove the `_monodroid_get_android_api_level()` p/invoke, which is unused. Additionally: * Add comments for `JnienvInitializeArgs` on managed and native side. This should help keep the two `struct`s in sync in the future
1 parent 8298b6f commit 5b83139

File tree

12 files changed

+13
-54
lines changed

12 files changed

+13
-54
lines changed

src/Mono.Android/Android.Runtime/AndroidRuntime.cs

-4
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,11 @@ class AndroidRuntime : JniRuntime {
2222

2323
internal AndroidRuntime (IntPtr jnienv,
2424
IntPtr vm,
25-
bool allocNewObjectSupported,
2625
IntPtr classLoader,
2726
IntPtr classLoader_loadClass,
2827
bool jniAddNativeMethodRegistrationAttributePresent)
2928
: base (new AndroidRuntimeOptions (jnienv,
3029
vm,
31-
allocNewObjectSupported,
3230
classLoader,
3331
classLoader_loadClass,
3432
jniAddNativeMethodRegistrationAttributePresent))
@@ -87,7 +85,6 @@ public override void RaisePendingException (Exception pendingException)
8785
class AndroidRuntimeOptions : JniRuntime.CreationOptions {
8886
public AndroidRuntimeOptions (IntPtr jnienv,
8987
IntPtr vm,
90-
bool allocNewObjectSupported,
9188
IntPtr classLoader,
9289
IntPtr classLoader_loadClass,
9390
bool jniAddNativeMethodRegistrationAttributePresent)
@@ -96,7 +93,6 @@ public AndroidRuntimeOptions (IntPtr jnienv,
9693
ClassLoader = new JniObjectReference (classLoader, JniObjectReferenceType.Global);
9794
ClassLoader_LoadClass_id= classLoader_loadClass;
9895
InvocationPointer = vm;
99-
NewObjectRequired = !allocNewObjectSupported;
10096
ObjectReferenceManager = new AndroidObjectReferenceManager ();
10197
TypeManager = new AndroidTypeManager (jniAddNativeMethodRegistrationAttributePresent);
10298
ValueManager = new AndroidValueManager ();

src/Mono.Android/Android.Runtime/JNIEnv.cs

+3-15
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,7 @@ public static IntPtr AllocObject (Type type)
172172

173173
public static unsafe IntPtr StartCreateInstance (IntPtr jclass, IntPtr constructorId, JValue* constructorParameters)
174174
{
175-
if (JNIEnvInit.AllocObjectSupported) {
176-
return AllocObject (jclass);
177-
}
178-
return NewObject (jclass, constructorId, constructorParameters);
175+
return AllocObject (jclass);
179176
}
180177

181178
public static unsafe IntPtr StartCreateInstance (IntPtr jclass, IntPtr constructorId, params JValue[] constructorParameters)
@@ -186,8 +183,6 @@ public static unsafe IntPtr StartCreateInstance (IntPtr jclass, IntPtr construct
186183

187184
public static unsafe void FinishCreateInstance (IntPtr instance, IntPtr jclass, IntPtr constructorId, JValue* constructorParameters)
188185
{
189-
if (!JNIEnvInit.AllocObjectSupported)
190-
return;
191186
CallNonvirtualVoidMethod (instance, jclass, constructorId, constructorParameters);
192187
}
193188

@@ -199,10 +194,7 @@ public static unsafe void FinishCreateInstance (IntPtr instance, IntPtr jclass,
199194

200195
public static unsafe IntPtr StartCreateInstance (Type type, string jniCtorSignature, JValue* constructorParameters)
201196
{
202-
if (JNIEnvInit.AllocObjectSupported) {
203-
return AllocObject (type);
204-
}
205-
return CreateInstance (type, jniCtorSignature, constructorParameters);
197+
return AllocObject (type);
206198
}
207199

208200
public static unsafe IntPtr StartCreateInstance (Type type, string jniCtorSignature, params JValue[] constructorParameters)
@@ -213,9 +205,7 @@ public static unsafe IntPtr StartCreateInstance (Type type, string jniCtorSignat
213205

214206
public static unsafe IntPtr StartCreateInstance (string jniClassName, string jniCtorSignature, JValue* constructorParameters)
215207
{
216-
if (JNIEnvInit.AllocObjectSupported)
217-
return AllocObject (jniClassName);
218-
return CreateInstance (jniClassName, jniCtorSignature, constructorParameters);
208+
return AllocObject (jniClassName);
219209
}
220210

221211
public static unsafe IntPtr StartCreateInstance (string jniClassName, string jniCtorSignature, params JValue[] constructorParameters)
@@ -226,8 +216,6 @@ public static unsafe IntPtr StartCreateInstance (string jniClassName, string jni
226216

227217
public static unsafe void FinishCreateInstance (IntPtr instance, string jniCtorSignature, JValue* constructorParameters)
228218
{
229-
if (!JNIEnvInit.AllocObjectSupported)
230-
return;
231219
InvokeConstructor (instance, jniCtorSignature, constructorParameters);
232220
}
233221

src/Mono.Android/Android.Runtime/JNIEnvInit.cs

+2-5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace Android.Runtime
1313
static internal class JNIEnvInit
1414
{
1515
#pragma warning disable 0649
16+
// NOTE: Keep this in sync with the native side in src/native/monodroid/monodroid-glue-internal.hh
1617
internal struct JnienvInitializeArgs {
1718
public IntPtr javaVm;
1819
public IntPtr env;
@@ -22,7 +23,6 @@ internal struct JnienvInitializeArgs {
2223
public IntPtr Class_forName;
2324
public uint logCategories;
2425
public int version; // TODO: remove, not needed anymore
25-
public int androidSdkVersion;
2626
public int grefGcThreshold;
2727
public IntPtr grefIGCUserPeer;
2828
public int isRunningOnDesktop;
@@ -36,7 +36,6 @@ internal struct JnienvInitializeArgs {
3636
#pragma warning restore 0649
3737

3838
internal static AndroidValueManager? AndroidValueManager;
39-
internal static bool AllocObjectSupported;
4039
internal static bool IsRunningOnDesktop;
4140
internal static bool jniRemappingInUse;
4241
internal static bool LogAssemblyCategory;
@@ -94,12 +93,10 @@ internal static unsafe void Initialize (JnienvInitializeArgs* args)
9493

9594
mid_Class_forName = new JniMethodInfo (args->Class_forName, isStatic: true);
9695

97-
bool androidNewerThan10 = args->androidSdkVersion > 10;
9896
BoundExceptionType = (BoundExceptionType)args->ioExceptionType;
99-
androidRuntime = new AndroidRuntime (args->env, args->javaVm, androidNewerThan10, args->grefLoader, args->Loader_loadClass, args->jniAddNativeMethodRegistrationAttributePresent != 0);
97+
androidRuntime = new AndroidRuntime (args->env, args->javaVm, args->grefLoader, args->Loader_loadClass, args->jniAddNativeMethodRegistrationAttributePresent != 0);
10098
AndroidValueManager = (AndroidValueManager) androidRuntime.ValueManager;
10199

102-
AllocObjectSupported = androidNewerThan10;
103100
IsRunningOnDesktop = args->isRunningOnDesktop == 1;
104101

105102
grefIGCUserPeer_class = args->grefIGCUserPeer;

src/java-runtime/java/mono/android/MonoPackageManager.java

-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ public static void LoadApplication (Context context, ApplicationInfo runtimePack
120120
localDateTimeOffset,
121121
loader,
122122
MonoPackageManager_Resources.Assemblies,
123-
Build.VERSION.SDK_INT,
124123
isEmulator (),
125124
haveSplitApks
126125
);

src/java-runtime/java/mono/android/Runtime.java

-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public static native void initInternal (
2323
int localDateTimeOffset,
2424
ClassLoader loader,
2525
String[] assemblies,
26-
int apiLevel,
2726
boolean isEmulator,
2827
boolean haveSplitApks
2928
);

src/native/monodroid/internal-pinvokes.cc

-6
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,6 @@ _monodroid_gc_wait_for_bridge_processing ()
132132
mono_gc_wait_for_bridge_processing ();
133133
}
134134

135-
int
136-
_monodroid_get_android_api_level ()
137-
{
138-
return monodroidRuntime.get_android_api_level ();
139-
}
140-
141135
void
142136
monodroid_clear_gdb_wait ()
143137
{

src/native/monodroid/mono_android_Runtime.h

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/native/monodroid/monodroid-glue-internal.hh

+2-8
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ namespace xamarin::android::internal
8282
Java = 0x01,
8383
};
8484

85+
// NOTE: Keep this in sync with managed side in src/Mono.Android/Android.Runtime/JNIEnvInit.cs
8586
struct JnienvInitializeArgs {
8687
JavaVM *javaVm;
8788
JNIEnv *env;
@@ -91,7 +92,6 @@ namespace xamarin::android::internal
9192
jmethodID Class_forName;
9293
unsigned int logCategories;
9394
int version;
94-
int androidSdkVersion;
9595
int grefGcThreshold;
9696
jobject grefIGCUserPeer;
9797
int isRunningOnDesktop;
@@ -118,16 +118,11 @@ namespace xamarin::android::internal
118118
void Java_mono_android_Runtime_register (JNIEnv *env, jstring managedType, jclass nativeClass, jstring methods);
119119
void Java_mono_android_Runtime_initInternal (JNIEnv *env, jclass klass, jstring lang, jobjectArray runtimeApksJava,
120120
jstring runtimeNativeLibDir, jobjectArray appDirs, jint localDateTimeOffset,
121-
jobject loader, jobjectArray assembliesJava, jint apiLevel, jboolean isEmulator,
121+
jobject loader, jobjectArray assembliesJava, jboolean isEmulator,
122122
jboolean haveSplitApks);
123123

124124
jint Java_JNI_OnLoad (JavaVM *vm, void *reserved);
125125

126-
int get_android_api_level () const
127-
{
128-
return android_api_level;
129-
}
130-
131126
jclass get_java_class_System () const
132127
{
133128
return java_System;
@@ -252,7 +247,6 @@ namespace xamarin::android::internal
252247
#endif
253248
private:
254249
MonoMethod *registerType = nullptr;
255-
int android_api_level = 0;
256250
volatile bool monodroid_gdb_wait = true;
257251
jclass java_System;
258252
jmethodID java_System_identityHashCode;

src/native/monodroid/monodroid-glue.cc

+2-6
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,6 @@ MonodroidRuntime::init_android_runtime (JNIEnv *env, jclass runtimeClass, jobjec
819819
init.env = env;
820820
init.logCategories = log_categories;
821821
init.version = env->GetVersion ();
822-
init.androidSdkVersion = android_api_level;
823822
init.isRunningOnDesktop = is_running_on_desktop ? 1 : 0;
824823
init.brokenExceptionTransitions = application_config.broken_exception_transitions ? 1 : 0;
825824
init.packageNamingPolicy = static_cast<int>(application_config.package_naming_policy);
@@ -1353,7 +1352,7 @@ MonodroidRuntime::install_logging_handlers ()
13531352
inline void
13541353
MonodroidRuntime::Java_mono_android_Runtime_initInternal (JNIEnv *env, jclass klass, jstring lang, jobjectArray runtimeApksJava,
13551354
jstring runtimeNativeLibDir, jobjectArray appDirs, jint localDateTimeOffset,
1356-
jobject loader, jobjectArray assembliesJava, jint apiLevel, jboolean isEmulator,
1355+
jobject loader, jobjectArray assembliesJava, jboolean isEmulator,
13571356
jboolean haveSplitApks)
13581357
{
13591358
char *mono_log_mask_raw = nullptr;
@@ -1394,7 +1393,6 @@ MonodroidRuntime::Java_mono_android_Runtime_initInternal (JNIEnv *env, jclass kl
13941393
);
13951394
}
13961395

1397-
android_api_level = apiLevel;
13981396
AndroidSystem::detect_embedded_dso_mode (applicationDirs);
13991397
AndroidSystem::set_running_in_emulator (isEmulator);
14001398

@@ -1548,7 +1546,6 @@ Java_mono_android_Runtime_init (JNIEnv *env, jclass klass, jstring lang, jobject
15481546
0,
15491547
loader,
15501548
assembliesJava,
1551-
apiLevel,
15521549
/* isEmulator */ JNI_FALSE,
15531550
/* haveSplitApks */ JNI_FALSE
15541551
);
@@ -1557,7 +1554,7 @@ Java_mono_android_Runtime_init (JNIEnv *env, jclass klass, jstring lang, jobject
15571554
JNIEXPORT void JNICALL
15581555
Java_mono_android_Runtime_initInternal (JNIEnv *env, jclass klass, jstring lang, jobjectArray runtimeApksJava,
15591556
jstring runtimeNativeLibDir, jobjectArray appDirs, jint localDateTimeOffset, jobject loader,
1560-
jobjectArray assembliesJava, jint apiLevel, jboolean isEmulator,
1557+
jobjectArray assembliesJava, jboolean isEmulator,
15611558
jboolean haveSplitApks)
15621559
{
15631560
monodroidRuntime.Java_mono_android_Runtime_initInternal (
@@ -1570,7 +1567,6 @@ Java_mono_android_Runtime_initInternal (JNIEnv *env, jclass klass, jstring lang,
15701567
localDateTimeOffset,
15711568
loader,
15721569
assembliesJava,
1573-
apiLevel,
15741570
isEmulator,
15751571
application_config.ignore_split_configs ? false : haveSplitApks
15761572
);

src/native/pinvoke-override/generate-pinvoke-tables.cc

-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ const std::vector<std::string> internal_pinvoke_names = {
4646
"monodroid_free",
4747
"_monodroid_freeifaddrs",
4848
"_monodroid_gc_wait_for_bridge_processing",
49-
"_monodroid_get_android_api_level",
5049
"_monodroid_get_dns_servers",
5150
"monodroid_get_dylib",
5251
"_monodroid_get_identity_hash_code",

src/native/pinvoke-override/pinvoke-tables.include

+3-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
namespace {
1212
#if INTPTR_MAX == INT64_MAX
1313
//64-bit internal p/invoke table
14-
std::array<PinvokeEntry, 49> internal_pinvokes {{
14+
std::array<PinvokeEntry, 48> internal_pinvokes {{
1515
{0x452e23128e42f0a, "monodroid_get_log_categories", reinterpret_cast<void*>(&monodroid_get_log_categories)},
1616
{0xa50ce5de13bf8b5, "_monodroid_timezone_get_default_id", reinterpret_cast<void*>(&_monodroid_timezone_get_default_id)},
1717
{0x19055d65edfd668e, "_monodroid_get_network_interface_up_state", reinterpret_cast<void*>(&_monodroid_get_network_interface_up_state)},
@@ -43,7 +43,6 @@ namespace {
4343
{0xc2a21d3f6c8ccc24, "_monodroid_lookup_replacement_method_info", reinterpret_cast<void*>(&_monodroid_lookup_replacement_method_info)},
4444
{0xc5b4690e13898fa3, "monodroid_timing_start", reinterpret_cast<void*>(&monodroid_timing_start)},
4545
{0xcc873ea8493d1dd5, "monodroid_embedded_assemblies_set_assemblies_prefix", reinterpret_cast<void*>(&monodroid_embedded_assemblies_set_assemblies_prefix)},
46-
{0xce439cfbe29dec11, "_monodroid_get_android_api_level", reinterpret_cast<void*>(&_monodroid_get_android_api_level)},
4746
{0xd1e121b94ea63f2e, "_monodroid_gref_get", reinterpret_cast<void*>(&_monodroid_gref_get)},
4847
{0xd5151b00eb33d85e, "monodroid_TypeManager_get_java_class_name", reinterpret_cast<void*>(&monodroid_TypeManager_get_java_class_name)},
4948
{0xda517ef392b6a888, "java_interop_free", reinterpret_cast<void*>(&java_interop_free)},
@@ -553,14 +552,13 @@ constexpr hash_t system_security_cryptography_native_android_library_hash = 0x18
553552
constexpr hash_t system_globalization_native_library_hash = 0x28b5c8fca080abd5;
554553
#else
555554
//32-bit internal p/invoke table
556-
std::array<PinvokeEntry, 49> internal_pinvokes {{
555+
std::array<PinvokeEntry, 48> internal_pinvokes {{
557556
{0xb7a486a, "monodroid_TypeManager_get_java_class_name", reinterpret_cast<void*>(&monodroid_TypeManager_get_java_class_name)},
558557
{0xf562bd9, "monodroid_embedded_assemblies_set_assemblies_prefix", reinterpret_cast<void*>(&monodroid_embedded_assemblies_set_assemblies_prefix)},
559558
{0x1a8eab17, "_monodroid_get_identity_hash_code", reinterpret_cast<void*>(&_monodroid_get_identity_hash_code)},
560559
{0x227a2636, "monodroid_get_namespaced_system_property", reinterpret_cast<void*>(&monodroid_get_namespaced_system_property)},
561560
{0x2a0e1744, "java_interop_strdup", reinterpret_cast<void*>(&java_interop_strdup)},
562561
{0x2aea7c33, "_monodroid_max_gref_get", reinterpret_cast<void*>(&_monodroid_max_gref_get)},
563-
{0x2f7d0f53, "_monodroid_get_android_api_level", reinterpret_cast<void*>(&_monodroid_get_android_api_level)},
564562
{0x30b9487b, "_monodroid_get_dns_servers", reinterpret_cast<void*>(&_monodroid_get_dns_servers)},
565563
{0x3227d81a, "monodroid_timing_start", reinterpret_cast<void*>(&monodroid_timing_start)},
566564
{0x333d4835, "_monodroid_lookup_replacement_method_info", reinterpret_cast<void*>(&_monodroid_lookup_replacement_method_info)},
@@ -1095,6 +1093,6 @@ constexpr hash_t system_security_cryptography_native_android_library_hash = 0x93
10951093
constexpr hash_t system_globalization_native_library_hash = 0xa66f1e5a;
10961094
#endif
10971095

1098-
constexpr size_t internal_pinvokes_count = 49;
1096+
constexpr size_t internal_pinvokes_count = 48;
10991097
constexpr size_t dotnet_pinvokes_count = 477;
11001098
} // end of anonymous namespace

src/native/runtime-base/internal-pinvokes.hh

-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ void _monodroid_weak_gref_delete (jobject handle, char type, const char *threadN
3535
void _monodroid_lref_log_new (int lrefc, jobject handle, char type, const char *threadName, int threadId, const char *from, int from_writable);
3636
void _monodroid_lref_log_delete (int lrefc, jobject handle, char type, const char *threadName, int threadId, const char *from, int from_writable);
3737
void _monodroid_gc_wait_for_bridge_processing ();
38-
int _monodroid_get_android_api_level ();
3938
void monodroid_clear_gdb_wait ();
4039
void* _monodroid_get_identity_hash_code (JNIEnv *env, void *v);
4140
void* _monodroid_timezone_get_default_id ();

0 commit comments

Comments
 (0)