Skip to content

Commit b5fc4cf

Browse files
committed
Don't add new public API
I'm not sure that `GetTypeFromAssemblyQualifiedName()` is actually a good idea or not, so I'd rather not add it as public API, yet it's required in order to make the sample work? How do we square this circle? With build configs (redux!). Commit c6c487b added the "Standalone" build config, while commit db84cc3 noted that it didn't quite work right, because "just" using `AdditionalProperties="Standalone=true"` didn't result in a `Java.Interop.dll` which had the right build config. Figure this out. The magic voodoo is that the output directories need to differ for each build config, because reusing the same output path leads to "madness" (parallel builds overwrite files, resulting in possible build breaks, etc., etc.). The key properties that need to differ based on "build config" are: * `$(IntermediateOutputPath)`, which contains intermediate files like AssemblyInfo! * `$(OutputPath)`, which is where the final assemblies are written. Update `Java.Interop.csproj` to treat `$(UseNativeAot)` as a "distinct" build config, which also sets `FEATURE_NATIVE_AOT`. This allows `GetTypeFromAssemblyQualifiedName()` to be `internal` by default, and only public when used by/built from the Hello-NativeAOTFromJNI sample. The next new public API is `JniRuntime.UseMarshalMemberBuilder`. We can make that `internal` for now by making `Java.Runtime.Environment.dll` a "friend" assembly to `Java.Interop.dll` via `[InternalsVisibleTo]`, then fix up the resulting build errors (as both assemblies had `NativeMethods` types). Remove the inclusion of `ManagedValueManager.cs` from `Hello-NativeAOTFromJNI.csproj`. It's no longer needed as of commit 6920e6c.
1 parent f71cadb commit b5fc4cf

File tree

8 files changed

+61
-48
lines changed

8 files changed

+61
-48
lines changed

samples/Hello-NativeAOTFromJNI/Hello-NativeAOTFromJNI.csproj

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
<ItemGroup>
1616
<ProjectReference Include="..\..\src\Java.Interop\Java.Interop.csproj"
17-
AdditionalProperties="Standalone=True"
17+
AdditionalProperties="Standalone=True;UseNativeAot=True"
1818
/>
1919
<ProjectReference Include="..\..\src\Java.Runtime.Environment\Java.Runtime.Environment.csproj"
2020
AdditionalProperties="Standalone=True"
@@ -28,10 +28,6 @@
2828
<TrimmerRootDescriptor Include="Hello-NativeAOTFromJNI.xml" />
2929
</ItemGroup>
3030

31-
<ItemGroup>
32-
<Compile Include="../../src/Java.Runtime.Environment/Java.Interop/ManagedValueManager.cs" />
33-
</ItemGroup>
34-
3531
<ItemGroup>
3632
<Content Include="$(OutputPath)hello-from-java.jar" CopyToPublishDirectory="PreserveNewest" />
3733
</ItemGroup>

src/Java.Interop/Java.Interop.csproj

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@
2222
<Import Project="..\..\TargetFrameworkDependentValues.props" />
2323
<PropertyGroup>
2424
<DefineConstants>INTEROP;FEATURE_JNIOBJECTREFERENCE_INTPTRS;INTERNAL_NULLABLE_ATTRIBUTES;$(JavaInteropDefineConstants)</DefineConstants>
25-
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\$(TargetFramework.ToLowerInvariant())\</IntermediateOutputPath>
26-
<OutputPath>$(ToolOutputFullPath)</OutputPath>
27-
<DocumentationFile>$(ToolOutputFullPath)Java.Interop.xml</DocumentationFile>
25+
<IntermediateOutputPath Condition=" '$(UseNativeAot)' == 'true' ">$(BaseIntermediateOutputPath)$(Configuration)+NativeAOT\$(TargetFramework.ToLowerInvariant())\</IntermediateOutputPath>
26+
<IntermediateOutputPath Condition=" '$(IntermediateOutputPath)' == '' ">$(BaseIntermediateOutputPath)$(Configuration)\$(TargetFramework.ToLowerInvariant())\</IntermediateOutputPath>
27+
<OutputPath Condition=" '$(UseNativeAot)' == 'true' ">bin\$(Configuration)+NativeAOT-$(DotNetTargetFramework.ToLowerInvariant())\</OutputPath>
28+
<OutputPath Condition=" '$(OutputPath)' == '' ">$(ToolOutputFullPath)</OutputPath>
29+
<DocumentationFile>$(OutputPath)Java.Interop.xml</DocumentationFile>
2830
<JNIEnvGenPath>$(BuildToolOutputFullPath)</JNIEnvGenPath>
2931
<LangVersion Condition=" '$(JIBuildingForNetCoreApp)' == 'True' ">9.0</LangVersion>
3032
<LangVersion Condition=" '$(LangVersion)' == '' ">8.0</LangVersion>
3133
<Version>$(JICoreLibVersion)</Version>
32-
<Standalone Condition=" '$(Standalone)' == '' ">true</Standalone>
3334
</PropertyGroup>
3435
<PropertyGroup Condition=" '$(Standalone)' == 'True' ">
3536
<DefineConstants Condition=" '$(JIBuildingForNetCoreApp)' == 'True' ">FEATURE_JNIENVIRONMENT_JI_FUNCTION_POINTERS;$(DefineConstants)</DefineConstants>
@@ -38,6 +39,9 @@
3839
<PropertyGroup Condition=" '$(Standalone)' != 'True' ">
3940
<DefineConstants>FEATURE_JNIENVIRONMENT_JI_PINVOKES;$(DefineConstants)</DefineConstants>
4041
</PropertyGroup>
42+
<PropertyGroup Condition=" '$(UseNativeAot)' == 'True' ">
43+
<DefineConstants>FEATURE_NATIVE_AOT;$(DefineConstants)</DefineConstants>
44+
</PropertyGroup>
4145
<ItemGroup>
4246
<Compile Condition=" '$(TargetFramework)' == 'netstandard2.0' " Include="..\utils\NullableAttributes.cs" />
4347
<Compile Remove="Java.Interop\JniLocationException.cs" />

src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public JniMarshalMemberBuilder MarshalMemberBuilder {
2626
return marshalMemberBuilder;
2727
}
2828
}
29-
public bool UseMarshalMemberBuilder => marshalMemberBuilder != null;
29+
30+
internal bool UseMarshalMemberBuilder => marshalMemberBuilder != null;
3031

3132
[System.Diagnostics.CodeAnalysis.SuppressMessage ("Design", "CA1031:Do not catch general exception types", Justification = "the *.Export assemblies are optional, so we don't care when they cannot be loaded (they are presumably missing)")]
3233
#if NET

src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,12 @@ IEnumerable<Type> CreateGetTypesForSimpleReferenceEnumerator (string jniSimpleRe
372372

373373
protected virtual ReplacementMethodInfo? GetReplacementMethodInfoCore (string jniSimpleReference, string jniMethodName, string jniMethodSignature) => null;
374374

375-
public virtual Type GetTypeFromAssemblyQualifiedName (string assemblyQualifiedTypeName)
375+
#if FEATURE_NATIVE_AOT
376+
public virtual
377+
#else // FEATURE_NATIVE_AOT
378+
internal
379+
#endif // FEATURE_NATIVE_AOT
380+
Type GetTypeFromAssemblyQualifiedName (string assemblyQualifiedTypeName)
376381
{
377382
AssertValid ();
378383

src/Java.Interop/Properties/AssemblyInfo.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@
1515
"814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0" +
1616
"d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b" +
1717
"2c9733db")]
18+
[assembly: InternalsVisibleTo (
19+
"Java.Runtime.Environment, PublicKey=" +
20+
"0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf1" +
21+
"6cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2" +
22+
"814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0" +
23+
"d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b" +
24+
"2c9733db")]
1825
[assembly: InternalsVisibleTo (
1926
"Java.Interop-Tests, PublicKey=" +
2027
"0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf1" +

src/Java.Runtime.Environment/Java.Interop/JreRuntime.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -281,10 +281,10 @@ static JavaInteropLibJvmLibraryHandler ()
281281
public override void LoadJvmLibrary (string path)
282282
{
283283
IntPtr errorPtr = IntPtr.Zero;
284-
int r = NativeMethods.java_interop_jvm_load_with_error_message (path, out errorPtr);
284+
int r = JreNativeMethods.java_interop_jvm_load_with_error_message (path, out errorPtr);
285285
if (r != 0) {
286286
string? error = Marshal.PtrToStringAnsi (errorPtr);
287-
NativeMethods.java_interop_free (errorPtr);
287+
JreNativeMethods.java_interop_free (errorPtr);
288288
if (r == JAVA_INTEROP_JVM_FAILED_ALREADY_LOADED) {
289289
return;
290290
}
@@ -294,17 +294,17 @@ public override void LoadJvmLibrary (string path)
294294

295295
public override int CreateJavaVM (out IntPtr javavm, out IntPtr jnienv, ref JavaVMInitArgs args)
296296
{
297-
return NativeMethods.java_interop_jvm_create (out javavm, out jnienv, ref args);
297+
return JreNativeMethods.java_interop_jvm_create (out javavm, out jnienv, ref args);
298298
}
299299

300300
public override IEnumerable<IntPtr> GetAvailableInvocationPointers ()
301301
{
302302
int nVMs;
303-
int r = NativeMethods.java_interop_jvm_list (null, 0, out nVMs);
303+
int r = JreNativeMethods.java_interop_jvm_list (null, 0, out nVMs);
304304
if (r != 0)
305305
throw new NotSupportedException ("JNI_GetCreatedJavaVMs() returned: " + r.ToString ());
306306
var handles = new IntPtr [nVMs];
307-
r = NativeMethods.java_interop_jvm_list (handles, handles.Length, out nVMs);
307+
r = JreNativeMethods.java_interop_jvm_list (handles, handles.Length, out nVMs);
308308
if (r != 0)
309309
throw new InvalidOperationException ("JNI_GetCreatedJavaVMs() [take 2!] returned: " + r.ToString ());
310310
return handles;
@@ -315,14 +315,14 @@ public override void Dispose ()
315315
}
316316
}
317317

318-
partial class NativeMethods {
318+
partial class JreNativeMethods {
319319

320-
static NativeMethods ()
320+
static JreNativeMethods ()
321321
{
322322
if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
323323
var baseDir = Path.GetDirectoryName (typeof (JreRuntime).Assembly.Location) ?? throw new NotSupportedException ();
324324
var newDir = Path.Combine (baseDir, Environment.Is64BitProcess ? "win-x64" : "win-x86");
325-
NativeMethods.AddDllDirectory (newDir);
325+
JreNativeMethods.AddDllDirectory (newDir);
326326
}
327327
}
328328

src/Java.Runtime.Environment/Java.Interop/MonoRuntimeObjectReferenceManager.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,19 @@ class MonoRuntimeObjectReferenceManager : JniRuntime.JniObjectReferenceManager {
1313
public override void OnSetRuntime (JniRuntime runtime)
1414
{
1515
base.OnSetRuntime (runtime);
16-
bridge = NativeMethods.java_interop_gc_bridge_get_current ();
16+
bridge = JreNativeMethods.java_interop_gc_bridge_get_current ();
1717
if (bridge != IntPtr.Zero) {
18-
logLocalRefs = NativeMethods.java_interop_gc_bridge_lref_get_log_file (bridge) != IntPtr.Zero;
19-
logGlobalRefs = NativeMethods.java_interop_gc_bridge_gref_get_log_file (bridge) != IntPtr.Zero;
18+
logLocalRefs = JreNativeMethods.java_interop_gc_bridge_lref_get_log_file (bridge) != IntPtr.Zero;
19+
logGlobalRefs = JreNativeMethods.java_interop_gc_bridge_gref_get_log_file (bridge) != IntPtr.Zero;
2020
}
2121
}
2222

2323
public override int GlobalReferenceCount {
24-
get {return NativeMethods.java_interop_gc_bridge_get_gref_count (bridge);}
24+
get {return JreNativeMethods.java_interop_gc_bridge_get_gref_count (bridge);}
2525
}
2626

2727
public override int WeakGlobalReferenceCount {
28-
get {return NativeMethods.java_interop_gc_bridge_get_weak_gref_count (bridge);}
28+
get {return JreNativeMethods.java_interop_gc_bridge_get_weak_gref_count (bridge);}
2929
}
3030

3131
public override bool LogLocalReferenceMessages {
@@ -36,8 +36,8 @@ public override void WriteLocalReferenceLine (string format, params object[] arg
3636
{
3737
if (!LogLocalReferenceMessages)
3838
return;
39-
NativeMethods.java_interop_gc_bridge_lref_log_message (bridge, 0, string.Format (format, args));
40-
NativeMethods.java_interop_gc_bridge_lref_log_message (bridge, 0, "\n");
39+
JreNativeMethods.java_interop_gc_bridge_lref_log_message (bridge, 0, string.Format (format, args));
40+
JreNativeMethods.java_interop_gc_bridge_lref_log_message (bridge, 0, "\n");
4141
}
4242

4343
public override JniObjectReference CreateLocalReference (JniObjectReference reference, ref int localReferenceCount)
@@ -46,7 +46,7 @@ public override JniObjectReference CreateLocalReference (JniObjectReference refe
4646
return reference;
4747

4848
var r = base.CreateLocalReference (reference, ref localReferenceCount);
49-
NativeMethods.java_interop_gc_bridge_lref_log_new (bridge,
49+
JreNativeMethods.java_interop_gc_bridge_lref_log_new (bridge,
5050
localReferenceCount,
5151
reference.Handle,
5252
ToByte (reference.Type),
@@ -76,7 +76,7 @@ public override void DeleteLocalReference (ref JniObjectReference reference, ref
7676
{
7777
if (!reference.IsValid)
7878
return;
79-
NativeMethods.java_interop_gc_bridge_lref_log_delete (bridge,
79+
JreNativeMethods.java_interop_gc_bridge_lref_log_delete (bridge,
8080
localReferenceCount,
8181
reference.Handle,
8282
ToByte (reference.Type),
@@ -91,7 +91,7 @@ public override void CreatedLocalReference (JniObjectReference reference, ref in
9191
if (!reference.IsValid)
9292
return;
9393
base.CreatedLocalReference (reference, ref localReferenceCount);
94-
NativeMethods.java_interop_gc_bridge_lref_log_new (bridge,
94+
JreNativeMethods.java_interop_gc_bridge_lref_log_new (bridge,
9595
localReferenceCount,
9696
reference.Handle,
9797
ToByte (reference.Type),
@@ -106,7 +106,7 @@ public override IntPtr ReleaseLocalReference (ref JniObjectReference reference,
106106
{
107107
if (!reference.IsValid)
108108
return IntPtr.Zero;
109-
NativeMethods.java_interop_gc_bridge_lref_log_delete (bridge,
109+
JreNativeMethods.java_interop_gc_bridge_lref_log_delete (bridge,
110110
localReferenceCount,
111111
reference.Handle,
112112
ToByte (reference.Type),
@@ -124,16 +124,16 @@ public override void WriteGlobalReferenceLine (string format, params object?[]?
124124
{
125125
if (!LogGlobalReferenceMessages)
126126
return;
127-
NativeMethods.java_interop_gc_bridge_gref_log_message (bridge, 0, string.Format (format, args!));
128-
NativeMethods.java_interop_gc_bridge_gref_log_message (bridge, 0, "\n");
127+
JreNativeMethods.java_interop_gc_bridge_gref_log_message (bridge, 0, string.Format (format, args!));
128+
JreNativeMethods.java_interop_gc_bridge_gref_log_message (bridge, 0, "\n");
129129
}
130130

131131
public override JniObjectReference CreateGlobalReference (JniObjectReference reference)
132132
{
133133
if (!reference.IsValid)
134134
return reference;
135135
var n = base.CreateGlobalReference (reference);
136-
NativeMethods.java_interop_gc_bridge_gref_log_new (bridge,
136+
JreNativeMethods.java_interop_gc_bridge_gref_log_new (bridge,
137137
reference.Handle,
138138
ToByte (reference.Type),
139139
n.Handle,
@@ -148,7 +148,7 @@ public override void DeleteGlobalReference (ref JniObjectReference reference)
148148
{
149149
if (!reference.IsValid)
150150
return;
151-
NativeMethods.java_interop_gc_bridge_gref_log_delete (bridge,
151+
JreNativeMethods.java_interop_gc_bridge_gref_log_delete (bridge,
152152
reference.Handle,
153153
ToByte (reference.Type),
154154
GetCurrentManagedThreadName (LogGlobalReferenceMessages),
@@ -162,7 +162,7 @@ public override JniObjectReference CreateWeakGlobalReference (JniObjectReference
162162
if (!reference.IsValid)
163163
return reference;
164164
var n = base.CreateWeakGlobalReference (reference);
165-
NativeMethods.java_interop_gc_bridge_weak_gref_log_new (bridge,
165+
JreNativeMethods.java_interop_gc_bridge_weak_gref_log_new (bridge,
166166
reference.Handle,
167167
ToByte (reference.Type),
168168
n.Handle,
@@ -177,7 +177,7 @@ public override void DeleteWeakGlobalReference (ref JniObjectReference reference
177177
{
178178
if (!reference.IsValid)
179179
return;
180-
NativeMethods.java_interop_gc_bridge_weak_gref_log_delete (bridge,
180+
JreNativeMethods.java_interop_gc_bridge_weak_gref_log_delete (bridge,
181181
reference.Handle,
182182
ToByte (reference.Type),
183183
GetCurrentManagedThreadName (LogGlobalReferenceMessages),
@@ -202,7 +202,7 @@ static byte ToByte (JniObjectReferenceType type)
202202
}
203203
}
204204

205-
partial class NativeMethods {
205+
partial class JreNativeMethods {
206206

207207
[DllImport (JavaInteropLib, CallingConvention=CallingConvention.Cdecl)]
208208
internal static extern int java_interop_gc_bridge_get_gref_count (IntPtr bridge);

src/Java.Runtime.Environment/Java.Interop/MonoRuntimeValueManager.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,40 +27,40 @@ public override void OnSetRuntime (JniRuntime runtime)
2727
{
2828
base.OnSetRuntime (runtime);
2929

30-
bridge = NativeMethods.java_interop_gc_bridge_get_current ();
30+
bridge = JreNativeMethods.java_interop_gc_bridge_get_current ();
3131
if (bridge != IntPtr.Zero)
3232
return;
3333

34-
bridge = NativeMethods.java_interop_gc_bridge_new (runtime.InvocationPointer);
34+
bridge = JreNativeMethods.java_interop_gc_bridge_new (runtime.InvocationPointer);
3535
if (bridge == IntPtr.Zero)
3636
throw new NotSupportedException ("Could not initialize JNI::Mono GC Bridge!");
3737

3838
try {
39-
if (NativeMethods.java_interop_gc_bridge_set_bridge_processing_field (bridge, typeof (MonoRuntimeValueManager).TypeHandle, nameof (GCBridgeProcessingIsActive)) < 0)
39+
if (JreNativeMethods.java_interop_gc_bridge_set_bridge_processing_field (bridge, typeof (MonoRuntimeValueManager).TypeHandle, nameof (GCBridgeProcessingIsActive)) < 0)
4040
throw new NotSupportedException ("Could not set bridge processing field!");
4141
foreach (var t in new[]{typeof (JavaObject), typeof (JavaException)}) {
42-
if (NativeMethods.java_interop_gc_bridge_register_bridgeable_type (bridge, t.TypeHandle) < 0)
42+
if (JreNativeMethods.java_interop_gc_bridge_register_bridgeable_type (bridge, t.TypeHandle) < 0)
4343
throw new NotSupportedException ("Could not register type " + t.FullName + "!");
4444
}
45-
if (NativeMethods.java_interop_gc_bridge_add_current_app_domain (bridge) < 0)
45+
if (JreNativeMethods.java_interop_gc_bridge_add_current_app_domain (bridge) < 0)
4646
throw new NotSupportedException ("Could not register current AppDomain!");
47-
if (NativeMethods.java_interop_gc_bridge_set_current_once (bridge) < 0)
47+
if (JreNativeMethods.java_interop_gc_bridge_set_current_once (bridge) < 0)
4848
throw new NotSupportedException ("Could not set GC Bridge instance!");
4949
}
5050
catch (Exception) {
51-
NativeMethods.java_interop_gc_bridge_free (bridge);
51+
JreNativeMethods.java_interop_gc_bridge_free (bridge);
5252
bridge = IntPtr.Zero;
5353
throw;
5454
}
55-
if (NativeMethods.java_interop_gc_bridge_register_hooks (bridge, GCBridgeUseWeakReferenceKind.Jni) < 0)
55+
if (JreNativeMethods.java_interop_gc_bridge_register_hooks (bridge, GCBridgeUseWeakReferenceKind.Jni) < 0)
5656
throw new NotSupportedException ("Could not register GC Bridge with Mono!");
5757
}
5858

5959
public override void WaitForGCBridgeProcessing ()
6060
{
6161
if (!GCBridgeProcessingIsActive)
6262
return;
63-
NativeMethods.java_interop_gc_bridge_wait_for_bridge_processing (bridge);
63+
JreNativeMethods.java_interop_gc_bridge_wait_for_bridge_processing (bridge);
6464
}
6565

6666
public override void CollectPeers ()
@@ -92,7 +92,7 @@ protected override void Dispose (bool disposing)
9292
}
9393

9494
if (bridge != IntPtr.Zero) {
95-
NativeMethods.java_interop_gc_bridge_remove_current_app_domain (bridge);
95+
JreNativeMethods.java_interop_gc_bridge_remove_current_app_domain (bridge);
9696
bridge = IntPtr.Zero;
9797
}
9898
}
@@ -382,7 +382,7 @@ internal static void Collect ()
382382
}
383383
}
384384

385-
partial class NativeMethods {
385+
partial class JreNativeMethods {
386386

387387
const string JavaInteropLib = "java-interop";
388388

0 commit comments

Comments
 (0)