@@ -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