美文网首页
使用Android-NDK检测SO库是否支持16kb

使用Android-NDK检测SO库是否支持16kb

作者: Gavin_2020 | 来源:发表于2025-08-28 17:03 被阅读0次

第一步、

首先需要下载好android NDK并记录目录路径

第二步、

创建一个空白的记事本文件
添加如下

#使用方法 .\check_so.bat D:\work\Project\AndroidProject\IdcardProject\Sample\src\main\jniLibs\arm64-v8a\libAndroidSIDCard.so
#NDK_PATH设置为自己的ndk路径

@echo off
setlocal

set NDK_PATH=D:\work\SDK\AndroidSDK\ndk-bundle
set SO_FILE=%1

if "%SO_FILE%"=="" (
    echo Usage: check_so.bat [path_to_so_file]
    exit /b 1
)

if not exist "%SO_FILE%" (
    echo Error: SO file not found - %SO_FILE%
    exit /b 1
)

echo Checking: %SO_FILE%
echo.

:: 自动检测架构
for %%a in (arm64-v8a armeabi-v7a x86 x86_64) do (
    echo %SO_FILE% | find /i "%%a" >nul
    if !errorlevel! equ 0 (
        set ARCH=%%a
    )
)

if "%ARCH%"=="arm64-v8a" (
    set READELF=%NDK_PATH%\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-readelf.exe
) else if "%ARCH%"=="armeabi-v7a" (
    set READELF=%NDK_PATH%\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-readelf.exe
) else if "%ARCH%"=="x86_64" (
    set READELF=%NDK_PATH%\toolchains\llvm\prebuilt\windows-x86_64\bin\x86_64-linux-android-readelf.exe
) else if "%ARCH%"=="x86" (
    set READELF=%NDK_PATH%\toolchains\llvm\prebuilt\windows-x86_64\bin\i686-linux-android-readelf.exe
) else (
    echo Could not detect architecture, using arm64...
    set READELF=%NDK_PATH%\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-readelf.exe
)

echo Using readelf: %READELF%
echo.

%READELF% -l "%SO_FILE%"

echo.
echo Interpretation:
echo   0x1000 = 4KB pages
echo   0x4000 = 16KB pages  ^<- Required for some devices
echo   0x10000 = 64KB pages
endlocal

第三步、

保存后,将txt后缀改为bat.


image.png

第四步、

使用命令行运行脚本,如下命令,后半段命令改为自己需要检测的so文件路径

 .\check_so.bat D:\work\Project\AndroidProject\IdcardProject\Sample\src\main\jniLibs\arm64-v8a\libAndroidSIDCard.so
image.png

正常输出应该类似:

text
Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 R   0x4000
LOAD           0x004000 0x0000000000004000 0x0000000000004000 0x000000 0x000000 R E 0x4000

✅ Align = 0x4000:支持 16KB 页面
❌ Align = 0x1000:只支持 4KB 页面,需要重新编译

✅ 支持条件

  1. 硬件架构要求
    ARM64 (aarch64):完全支持 16KB 页面
    ARMv7 (armeabi-v7a):支持,但需要特定配置
    x86_64:支持
    x86:支持有限

  2. Android 版本要求
    Android 10 (API 29)+:原生支持
    Android 9 (API 28):部分支持,需要额外配置
    Android 8.1及以下:支持有限,不推荐

  3. NDK 工具链要求
    NDK r21+:完整支持
    NDK r18-r20:实验性支持

GCC 版本:建议使用 LLVM/clang 工具链

编译支持16kb的SO库

打开你的android.mk文件,添加如下配置,重新编译即可,注意编译ndk版本要符合上述支持的版本。

-z,max-page-size=0x4000
image.png

相关文章

网友评论

      本文标题:使用Android-NDK检测SO库是否支持16kb

      本文链接:https://www.haomeiwen.com/subject/trmeajtx.html