Skip to content

Commit a6571ae

Browse files
ARM support: expand JVM os.arch detection, bit-ness fall back.
1 parent 8e2e0ea commit a6571ae

File tree

1 file changed

+40
-19
lines changed

1 file changed

+40
-19
lines changed

objectbox-java/src/main/java/io/objectbox/internal/NativeLibraryLoader.java

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,6 @@ public class NativeLibraryLoader {
120120
* (e.g. when running a x86 JVM on an amd64 machine).
121121
*/
122122
private static String getCpuArch() {
123-
// See https://github.com/openjdk/jdk/blob/master/make/autoconf/platform.m4 for possible values.
124-
// Note: any CPU architecture starting with "arm" is reported as "arm", aarch64 is reported as "aarch64".
125123
String osArch = System.getProperty("os.arch");
126124
String cpuArch = null;
127125
if (osArch != null) {
@@ -130,29 +128,52 @@ private static String getCpuArch() {
130128
cpuArch = "x64";
131129
} else if (osArch.equalsIgnoreCase("x86")) {
132130
cpuArch = "x86";
133-
} else if (osArch.equals("aarch64")) {
134-
cpuArch = "arm64";
135-
} else if (osArch.equals("arm")) {
136-
// Decide if ARMv6 or ARMv7 library should be used, need to get actual architecture from OS.
137-
String cpuArchOSOrNull = getCpuArchOSOrNull();
138-
if (cpuArchOSOrNull != null) {
139-
String cpuArchOSlower = cpuArchOSOrNull.toLowerCase();
140-
if (cpuArchOSlower.startsWith("armv6")) {
141-
cpuArch = "armv6";
142-
} else {
143-
// ARMv7 or 32-bit ARMv8
144-
cpuArch = "armv7";
145-
}
146-
} else {
131+
} else if ("aarch64".equals(osArch) || osArch.startsWith("armv8") || osArch.startsWith("arm64")) {
132+
// 64-bit ARM version of ObjectBox not built, yet. Fall back to 32-bit armv7 version and warn.
133+
//cpuArch = "arm64";
134+
cpuArch = "armv7";
135+
System.err.printf("[ObjectBox] 64-bit ARM os.arch %s currently not supported, will use %s%n",
136+
osArch, cpuArch);
137+
} else if (osArch.startsWith("arm")) {
138+
// 32-bit ARM
139+
if (osArch.startsWith("armv7") || osArch.startsWith("armeabi-v7")) {
147140
cpuArch = "armv7";
148-
System.err.println("Failed to get arch from OS - ObjectBox is defaulting to " + cpuArch);
141+
} else if (osArch.startsWith("armv6")) {
142+
cpuArch = "armv6";
143+
} else if ("arm".equals(osArch)) {
144+
// JVM may just report "arm" for any 32-bit ARM, so try to check with OS.
145+
String cpuArchOSOrNull = getCpuArchOSOrNull();
146+
if (cpuArchOSOrNull != null) {
147+
String cpuArchOS = cpuArchOSOrNull.toLowerCase();
148+
if (cpuArchOS.startsWith("armv7")) {
149+
cpuArch = "armv7";
150+
} else if (cpuArchOS.startsWith("armv6")){
151+
cpuArch = "armv6";
152+
} // else use fall back below.
153+
} // else use fall back below.
154+
}
155+
if (cpuArch == null) {
156+
// Fall back to lowest supported 32-bit ARM version.
157+
cpuArch = "armv6";
158+
System.err.printf("[ObjectBox] 32-bit ARM os.arch unknown (will use %s), " +
159+
"please report this to us: os.arch=%s, machine=%s%n",
160+
cpuArch, osArch, getCpuArchOSOrNull());
149161
}
150162
}
151163
}
164+
// If os.arch is not covered above try a x86 version based on JVM bit-ness.
152165
if (cpuArch == null) {
153166
String sunArch = System.getProperty("sun.arch.data.model");
154-
cpuArch = "32".equals(sunArch) ? "x86" : "x64";
155-
System.err.println("Unknown os.arch \"" + osArch + "\" - ObjectBox is defaulting to " + cpuArch);
167+
if ("64".equals(sunArch)) {
168+
cpuArch = "x64";
169+
} else if ("32".equals(sunArch)) {
170+
cpuArch = "x86";
171+
} else {
172+
cpuArch = "unknown";
173+
}
174+
System.err.printf("[ObjectBox] os.arch unknown (will use %s), " +
175+
"please report this to us: os.arch=%s, model=%s, machine=%s%n",
176+
cpuArch, osArch, sunArch, getCpuArchOSOrNull());
156177
}
157178
return cpuArch;
158179
}

0 commit comments

Comments
 (0)