diff --git a/tests/tests/os/jni/android_os_cts_SeccompTest.cpp b/tests/tests/os/jni/android_os_cts_SeccompTest.cpp
index 528696b..1ba8550 100644
--- a/tests/tests/os/jni/android_os_cts_SeccompTest.cpp
+++ b/tests/tests/os/jni/android_os_cts_SeccompTest.cpp
@@ -33,7 +33,7 @@
 struct __test_metadata* get_seccomp_test_list();
 }
 
-static const char TAG[] = "SecompBpfTest-Native";
+static const char TAG[] = "SeccompBpfTest-Native";
 
 jboolean android_security_cts_SeccompBpfTest_runKernelUnitTest(
       JNIEnv* env, jobject thiz __unused, jstring name) {
diff --git a/tests/tests/os/src/android/os/cts/SeccompTest.java b/tests/tests/os/src/android/os/cts/SeccompTest.java
index 0340580..7376079 100644
--- a/tests/tests/os/src/android/os/cts/SeccompTest.java
+++ b/tests/tests/os/src/android/os/cts/SeccompTest.java
@@ -50,6 +50,15 @@
         System.loadLibrary("ctsos_jni");
     }
 
+    // As this test validates a kernel system call interface, if the CTS tests
+    // were built for ARM but are running on an x86 CPU, the system call numbers
+    // will not be correct, so skip those tests.
+    private boolean isRunningUnderEmulatedAbi() {
+        final String primaryAbi = Build.SUPPORTED_ABIS[0];
+        return (CpuFeatures.isArmCpu() || CpuFeatures.isArm64Cpu()) &&
+               !(primaryAbi.equals("armeabi-v7a") || primaryAbi.equals("arm64-v8a"));
+    }
+
     public void testSeccomp() {
         if (OSFeatures.needsSeccompSupport()) {
             assertTrue("Please enable seccomp support "
@@ -62,6 +71,11 @@
         if (!OSFeatures.needsSeccompSupport())
             return;
 
+        if (isRunningUnderEmulatedAbi()) {
+            Log.d(TAG, "Skipping test running under an emulated ABI");
+            return;
+        }
+
         final String[] tests = {
             "global.mode_strict_support",
             "global.mode_strict_cannot_call_prctl",
@@ -137,6 +151,11 @@
         if (!OSFeatures.needsSeccompSupport())
             return;
 
+        if (isRunningUnderEmulatedAbi()) {
+            Log.d(TAG, "Skipping test running under an emulated ABI");
+            return;
+        }
+
         final String[] tests = {
             "global.seccomp_syscall",
             "global.seccomp_syscall_mode_lock",
@@ -175,6 +194,11 @@
         if (!OSFeatures.needsSeccompSupport())
             return;
 
+        if (isRunningUnderEmulatedAbi()) {
+            Log.d(TAG, "Skipping test running under an emulated ABI");
+            return;
+        }
+
         final IsolatedServiceConnection peer = new IsolatedServiceConnection();
         final Intent intent = new Intent(getContext(), IsolatedService.class);
         assertTrue(getContext().bindService(intent, peer, Context.BIND_AUTO_CREATE));
@@ -201,6 +225,11 @@
         if (!OSFeatures.needsSeccompSupport())
             return;
 
+        if (isRunningUnderEmulatedAbi()) {
+            Log.d(TAG, "Skipping test running under an emulated ABI");
+            return;
+        }
+
         final IsolatedServiceConnection peer = new IsolatedServiceConnection();
         final Intent intent = new Intent(getContext(), IsolatedService.class);
         assertTrue(getContext().bindService(intent, peer, Context.BIND_AUTO_CREATE));
