From 287258dfb73a9b7803a5534978de5857b7711966 Mon Sep 17 00:00:00 2001 From: Yan Yan Date: Mon, 8 Jan 2024 18:03:17 -0800 Subject: [PATCH] Support checking kernel bitness via JNI Bug: 319532485 Test: Verified the return value on husky(64-bit kernel) and mokey_go32 (32-bit kernel) Test: NetworkUtilsTest#testIsKernel64Bit Change-Id: I929ce23932698b44a72ce4f35e2bd5a41ba472ee --- framework/jni/android_net_NetworkUtils.cpp | 6 ++++++ framework/src/android/net/NetworkUtils.java | 2 ++ tests/unit/java/android/net/NetworkUtilsTest.java | 13 ++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/framework/jni/android_net_NetworkUtils.cpp b/framework/jni/android_net_NetworkUtils.cpp index 5403be79f0..51eaf1c9b2 100644 --- a/framework/jni/android_net_NetworkUtils.cpp +++ b/framework/jni/android_net_NetworkUtils.cpp @@ -24,6 +24,7 @@ #include #include +#include #include // NETID_USE_LOCAL_NAMESERVERS #include #include @@ -250,6 +251,10 @@ static void android_net_utils_setsockoptBytes(JNIEnv *env, jclass clazz, jobject } } +static jboolean android_net_utils_isKernel64Bit(JNIEnv *env, jclass clazz) { + return bpf::isKernel64Bit(); +} + // ---------------------------------------------------------------------------- /* @@ -272,6 +277,7 @@ static const JNINativeMethod gNetworkUtilMethods[] = { { "getDnsNetwork", "()Landroid/net/Network;", (void*) android_net_utils_getDnsNetwork }, { "setsockoptBytes", "(Ljava/io/FileDescriptor;II[B)V", (void*) android_net_utils_setsockoptBytes}, + { "isKernel64Bit", "()Z", (void*) android_net_utils_isKernel64Bit }, }; // clang-format on diff --git a/framework/src/android/net/NetworkUtils.java b/framework/src/android/net/NetworkUtils.java index fbdc024340..785c029492 100644 --- a/framework/src/android/net/NetworkUtils.java +++ b/framework/src/android/net/NetworkUtils.java @@ -438,4 +438,6 @@ public class NetworkUtils { public static native void setsockoptBytes(FileDescriptor fd, int level, int option, byte[] value) throws ErrnoException; + /** Returns whether the Linux Kernel is 64 bit */ + public static native boolean isKernel64Bit(); } diff --git a/tests/unit/java/android/net/NetworkUtilsTest.java b/tests/unit/java/android/net/NetworkUtilsTest.java index 5d789b4cb6..2bf22112b5 100644 --- a/tests/unit/java/android/net/NetworkUtilsTest.java +++ b/tests/unit/java/android/net/NetworkUtilsTest.java @@ -21,8 +21,14 @@ import static android.system.OsConstants.IPPROTO_ICMPV6; import static android.system.OsConstants.SOCK_DGRAM; import static android.system.OsConstants.SOL_SOCKET; import static android.system.OsConstants.SO_RCVTIMEO; + +import static com.android.compatibility.common.util.PropertyUtil.getVsrApiLevel; + import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; + import android.os.Build; import android.system.ErrnoException; import android.system.Os; @@ -38,7 +44,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.io.FileDescriptor; -import java.io.IOException; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -167,4 +172,10 @@ public class NetworkUtilsTest { assertEquals(writeTimeval, readTimeval); SocketUtils.closeSocketQuietly(sock); } + + @Test + public void testIsKernel64Bit() { + assumeTrue(getVsrApiLevel() > Build.VERSION_CODES.TIRAMISU); + assertTrue(NetworkUtils.isKernel64Bit()); + } }