@@ -120,8 +120,6 @@ public class NativeLibraryLoader {
120
120
* (e.g. when running a x86 JVM on an amd64 machine).
121
121
*/
122
122
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".
125
123
String osArch = System .getProperty ("os.arch" );
126
124
String cpuArch = null ;
127
125
if (osArch != null ) {
@@ -130,29 +128,52 @@ private static String getCpuArch() {
130
128
cpuArch = "x64" ;
131
129
} else if (osArch .equalsIgnoreCase ("x86" )) {
132
130
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" )) {
147
140
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 ());
149
161
}
150
162
}
151
163
}
164
+ // If os.arch is not covered above try a x86 version based on JVM bit-ness.
152
165
if (cpuArch == null ) {
153
166
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 ());
156
177
}
157
178
return cpuArch ;
158
179
}
0 commit comments