Skip to content

Commit 6ede44b

Browse files
authored
Merge pull request #79 from winnerspiros/android-native-fix-4658107465672926237
Fix Android native library loading and missing JNI export
2 parents 3389b9f + 326ebe5 commit 6ede44b

5 files changed

Lines changed: 31 additions & 14 deletions

File tree

osu.Android/Native/VulkanRenderer.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace osu.Android.Native
1010
public class VulkanRenderer : IDisposable
1111
{
1212
private long nativePtr;
13+
private readonly object disposeLock = new object();
1314

1415
public VulkanRenderer()
1516
{
@@ -18,7 +19,14 @@ public VulkanRenderer()
1819

1920
public void Initialize(IntPtr surface) => nVulkanInit(nativePtr, surface);
2021

21-
public void Render() => nVulkanRender(nativePtr);
22+
public void Render()
23+
{
24+
lock (disposeLock)
25+
{
26+
if (nativePtr != 0)
27+
nVulkanRender(nativePtr);
28+
}
29+
}
2230

2331
public void Dispose()
2432
{
@@ -28,10 +36,13 @@ public void Dispose()
2836

2937
protected virtual void Dispose(bool disposing)
3038
{
31-
if (nativePtr != 0)
39+
lock (disposeLock)
3240
{
33-
nVulkanDestroy(nativePtr);
34-
nativePtr = 0;
41+
if (nativePtr != 0)
42+
{
43+
nVulkanDestroy(nativePtr);
44+
nativePtr = 0;
45+
}
3546
}
3647
}
3748

osu.Android/Native/oboe_audio.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ extern "C" {
105105
nOboeStart((long)audioPtr);
106106
}
107107

108+
JNIEXPORT void JNICALL Java_osu_Android_Native_OboeAudio_nOboeStop(JNIEnv* env, jobject obj, jlong audioPtr) {
109+
nOboeStop((long)audioPtr);
110+
}
111+
108112
JNIEXPORT jdouble JNICALL Java_osu_Android_Native_OboeAudio_nOboeGetTimestamp(JNIEnv* env, jobject obj, jlong audioPtr) {
109113
return (jdouble)nGetTimestamp((long)audioPtr);
110114
}

osu.Android/OsuGameActivity.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ protected override void OnCreate(global::Android.OS.Bundle? savedInstanceState)
145145
{
146146
base.OnCreate(savedInstanceState);
147147

148+
global::Java.Lang.JavaSystem.LoadLibrary("osu.Android.Native");
149+
148150
// OnNewIntent() only fires for an activity if it's *re-launched* while it's on top of the activity stack.
149151
// on first launch we still have to fire manually.
150152
// reference: https://developer.android.com/reference/android/app/Activity#onNewIntent(android.content.Intent)

osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void TestSelectionDismissedOnUndo()
8686
InputManager.Click(MouseButton.Left);
8787
});
8888

89-
AddUntilStep("Selection changed", () => timingScreen.SelectedGroup.Value.Time == 2170);
89+
AddUntilStep("Selection changed", () => timingScreen.SelectedGroup.Value?.Time == 2170);
9090
AddUntilStep("Ensure seeked to correct time", () => EditorClock.CurrentTimeAccurate == 2170);
9191

9292
AddStep("Adjust offset", () =>
@@ -97,7 +97,7 @@ public void TestSelectionDismissedOnUndo()
9797

9898
AddUntilStep("wait for offset changed", () =>
9999
{
100-
return timingScreen.SelectedGroup.Value.ControlPoints.Any(c => c is TimingControlPoint) && timingScreen.SelectedGroup.Value.Time > 2170;
100+
return timingScreen.SelectedGroup.Value.ControlPoints.Any(c => c is TimingControlPoint) && timingScreen.SelectedGroup.Value?.Time > 2170;
101101
});
102102

103103
AddStep("undo", () => changeHandler?.RestoreState(-1));
@@ -114,7 +114,7 @@ public void TestSelectionDismissedOnUndo()
114114
// InputManager.Click(MouseButton.Left);
115115
// });
116116
//
117-
// AddUntilStep("Selection changed", () => timingScreen.SelectedGroup.Value.Time == 2170);
117+
// AddUntilStep("Selection changed", () => timingScreen.SelectedGroup.Value?.Time == 2170);
118118
// AddUntilStep("Ensure seeked to correct time", () => EditorClock.CurrentTimeAccurate == 2170);
119119
//
120120
// AddStep("Adjust offset", () =>
@@ -125,14 +125,14 @@ public void TestSelectionDismissedOnUndo()
125125
//
126126
// AddUntilStep("wait for offset changed", () =>
127127
// {
128-
// return timingScreen.SelectedGroup.Value.ControlPoints.Any(c => c is TimingControlPoint) && timingScreen.SelectedGroup.Value.Time > 2170;
128+
// return timingScreen.SelectedGroup.Value.ControlPoints.Any(c => c is TimingControlPoint) && timingScreen.SelectedGroup.Value?.Time > 2170;
129129
// });
130130
//
131131
// AddStep("undo", () => changeHandler?.RestoreState(-1));
132132
//
133133
// AddUntilStep("selection retained", () =>
134134
// {
135-
// return timingScreen.SelectedGroup.Value.ControlPoints.Any(c => c is TimingControlPoint) && timingScreen.SelectedGroup.Value.Time > 2170;
135+
// return timingScreen.SelectedGroup.Value.ControlPoints.Any(c => c is TimingControlPoint) && timingScreen.SelectedGroup.Value?.Time > 2170;
136136
// });
137137
//
138138
// AddAssert("check group count", () => editorBeatmap.ControlPointInfo.Groups.Count, () => Is.EqualTo(10));

osu.Game.Tests/Visual/UserInterface/TestSceneModPresetColumn.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ public void TestAddingFlow([Values] bool withSystemModActive)
226226
});
227227

228228
OsuPopover? popover = null;
229-
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault()) != null);
229+
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault())?.IsPresent == true);
230230
AddStep("attempt preset creation", () =>
231231
{
232232
InputManager.MoveMouseTo(popover.ChildrenOfType<ShearedButton>().Single());
@@ -254,7 +254,7 @@ public void TestAddingFlow([Values] bool withSystemModActive)
254254
InputManager.Click(MouseButton.Left);
255255
});
256256

257-
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault()) != null);
257+
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault())?.IsPresent == true);
258258
AddStep("clear mods", () => SelectedMods.Value = Array.Empty<Mod>());
259259
AddUntilStep("popover closed", () => !this.ChildrenOfType<OsuPopover>().Any());
260260
}
@@ -331,7 +331,7 @@ public void TestEditPresetName()
331331
});
332332

333333
OsuPopover? popover = null;
334-
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault()) != null);
334+
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault())?.IsPresent == true);
335335
AddStep("clear preset name", () => popover.ChildrenOfType<LabelledTextBox>().First().Current.Value = "");
336336
AddStep("attempt preset edit", () =>
337337
{
@@ -380,7 +380,7 @@ public void TestEditPresetMod()
380380
});
381381

382382
OsuPopover? popover = null;
383-
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault()) != null);
383+
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault())?.IsPresent == true);
384384
AddStep("click use current mods", () =>
385385
{
386386
InputManager.MoveMouseTo(popover.ChildrenOfType<ShearedButton>().ElementAt(0));
@@ -411,7 +411,7 @@ public void TestEditPresetMod()
411411
InputManager.Click(MouseButton.Left);
412412
});
413413

414-
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault()) != null);
414+
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType<OsuPopover>().FirstOrDefault())?.IsPresent == true);
415415
AddStep("click use current mods", () =>
416416
{
417417
InputManager.MoveMouseTo(popover.ChildrenOfType<ShearedButton>().ElementAt(0));

0 commit comments

Comments
 (0)