之前已经用 JNI/NDK 实现过获取 Page Size,但代码量较大,需要写 C++ 和配置 CMake。据说JNA (Java Native Access)是一个开源的 Java 库,允许 Java 代码直接调用 Native 动态库(如 libc.so)中的函数,无需编写 JNI 胶水代码,想试试是否真的如此。下面测试下用 JNA 在 Android 上调用 sysconf 获取内存页大小。
新建一个安卓工程,build.gradle.kts中加上这句依赖:
implementation("net.java.dev.jna:jna:5.17.0@aar")
再定义c库映射接口。创建一个接口,继承 Library,用于映射系统 C 库中的函数。这里我把这个接口定义在PageSizeUtil中,PageSizeUtil中再新增一个getPageSize方法调用sysconf函数。如下:
java
package com.example.testjna;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import android.system.OsConstants;
public class PageSizeUtil {
public interface CLibrary extends Library { // 告诉 JNA:这是一个"本地库映射接口",继承 Library 是固定写法。
// 加载系统 C 库(Linux/Android 上是 libc.so,Windows 上是 msvcrt.dll),并返回一个实现了 CLibrary 接口的实例。这个实例内部会处理所有 Java 到 C 的调用转换。
CLibrary INSTANCE = Native.load(
Platform.isWindows() ? "msvcrt" : "c",
CLibrary.class
);
long sysconf(int name); // 声明一个 Java 方法,它的方法名、参数类型、返回类型都与 C 函数 sysconf 匹配。JNA 会自动把 Java 调用转换成对 C 函数的调用。
}
public static long getPageSize() {
return CLibrary.INSTANCE.sysconf(OsConstants._SC_PAGE_SIZE);
}
}
测试代码以及运行结果:

ok. 调用成功。JNA官网地址:GitHub - java-native-access/jna: Java Native Access · GitHub ,有时间再看下,多了解。