Skip to content

Prajuab Riabroy's Blog

Survey Application – GNSS – UAV – Programing – Python – Dart&Flutter – Rust

Menu
  • Home
  • About Us
  • Survey Application
    • Surveyor Pocket Tools
    • Traverse Pro
    • XSection Plot
    • Geoid Height Pro
    • Spot Fire
    • โปรแกรมงานสำรวจสำหรับเครื่องคิดเลข Casio fx-5800P
    • โปรแกรมงานสำรวจสำหรับเครื่องคิดเลข Casio fx-9860G II SD
  • Download
  • Privacy Policy
Menu

คอมไพล์ PROJ 9.6.0 สำหรับแอนดรอยด์ แก้ปัญหาเพิ่มขนาด page size 16KB ตามกฎใหม่ของกูเกิ้ล

Posted on 12/05/2025

ตอนนี้เป็นตอนต่อ ของบทความที่แล้ว

คอมไพล์และบิวท์ไลบราลี PROJ4 รุ่น 9.3.0 แบบเนทีฟสำหรับแอนดรอยด์

ถ้าใครพัฒนาแอพลง Google play store จะเห็นข้อความของกูเกิ้ลส่งมาใน inbox ให้แก้ไขแอพโดยที่แก้ขนาดของ page size จากเดิม 4KB ที่ใช้มานานแล้วให้เป็น 16KB กูเกิ้ลแจ้งว่าจะให้แอพจะเร็วขึ้น เนื่องจากแอพผมไม่ได้ต้องการความเร็วในการคำนวณเหมือนพวกแอพเกมส์การแก้ปัญหาด้วย page size นี้คงไม่ได้ช่วยอะไร

กูเกิ้ลปรับกฎนี้ กำหนดเวลาให้ 1 พย. 2025 นี้ ผมก็เลยใช้เวลาว่างแก้ไข สำหรับในตัวแอพเองการบิวท์ต้องใช้ Android studio อยู่แล้วเบื้องหลัง จึงไม่ต้องทำอะไร เพียงแต่แอพผมมีการใช้ไลบรารี native ภายนอกอยู่สองไลบรารีคือ PROJ (libproj.so), Sqlite3 (libsqlite3.so) ผมต้องมาแก้ไขที่ตัวนี้

แอพทดสอบ “SurveyStar QuickTM”

และแอพที่จะมานำเสนอการแก้ไข page size ที่ต้องการขนาด 16 KB ก็คือ SurveyStar Quick TM ของผมนั่นเอง แอพนี้เป็นแอพฟรี ไม่มีการ subscription หน้าที่ของแอพคือให้ผู้ใช้กำหนดเส้นโครงแผนที่แบบ LDP (Low Distortion Projection) หรือบางท่านอาจจะติดปากว่า TM

ที่จริง TM เป็นเส้นโครงแผนที่ Transverse Mercator หรือหนึ่งในสามเส้นโครงแผนที่ที่นิยมนำมาใช้ทำ LDP อีกสองเส้นโครงแผนที่คือ LCC (Lambert Conic Conformal) และ OM (Oblique Mercator) พอกำหนดค่าพารามิเตอร์ของ LDP อย่างง่ายแล้วสามารถคำนวณค่าพิกัดกับ UTM ได้ทันที

การทดสอบ Page size

ผมไม่ค่อยแน่ใจว่า libproj.so และ libsqlite3.so ที่นำมาใช้ในแอพ จะมี page size เท่ากับ 16 KB หรือไม่ การทดสอบทำได้หลายวิธี

วิธีแรกคือใช้ทูลส์ “APK Analyzer” ที่ติดมากับ Android Studio โดยที่แนะนำโดยกูเกิ้ล แต่ผมพบว่าแสดงผลไม่ถูกต้องนัก วิธีใช้งานเปิดเมนู Run > APK Analyzer แล้วเลิกไฟล์ APK ของแอพเรา จะมีช่องคอลัมน์แสดง Alignment ผมดูตัวเลขพบว่า libproj.so และ libsqlite3.so มีขนาด 16KB ทั้งคู่เหมือนจะได้ข้อกำหนดแต่ผมก็ไม่แน่ใจเพราะสองไลบรารีนี้คอมไพล์ไว้นานแล้ว น่าจะร่วมๆ 4 ปี

วิธีที่สองใช้ llvm-objdump เนื่องจากผมใช้ลีนุกซ์ ใช้คำสั่ง sudo apt install llvm จะได้ llvm-objdump มาด้วย แต่เนื่องจาก llvm-objdump ต้องใช้กับไฟล์ไลบรารีโดยตรง ไม่ได้ตรวจที่ไฟล์ APK ผมจึงใช้คำสั่งกับไฟล์ *.so ผลที่ได้ตามคาดคือตัวเลข 2**12 ไม่ผ่าน กูเกิ้ลบอกไว้ว่าตัวเลข ที่ได้เช่น 2**12 และ 2**13 จะไม่ผ่าน ต้องเป็นตัวเลข 2**14 ขึ้นไปเท่านั้น

pbrobo@pbrobo-ThinkPad-P52:.../main/jniLibs/arm64-v8a$ llvm-objdump -p libsqlite3.so | grep LOAD
    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**12
    LOAD off    0x000000000003e814 vaddr 0x000000000003f814 paddr 0x000000000003f814 align 2**12
    LOAD off    0x00000000001719f0 vaddr 0x00000000001739f0 paddr 0x00000000001739f0 align 2**12
    LOAD off    0x00000000001744e8 vaddr 0x00000000001774e8 paddr 0x00000000001774e8 align 2**12
pbrobo@pbrobo-ThinkPad-P52:.../main/jniLibs/arm64-v8a$ llvm-objdump -p libproj.so | grep LOAD
    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**12
    LOAD off    0x00000000003f7dd0 vaddr 0x00000000003f8dd0 paddr 0x00000000003f8dd0 align 2**12
    LOAD off    0x000000000041ad80 vaddr 0x000000000041cd80 paddr 0x000000000041cd80 align 2**12
pbrobo@pbrobo-ThinkPad-P52:.../main/jniLibs/arm64-v8a$ 

วิธีที่สาม โดยการใช้สคริปต์ดาวน์โหลดได้ที่ check_elf_alignment.sh เมื่อดาวน์โหลดมาแล้วอย่าลืมใช้คำสั่ง chmod +x check_elf_alignmnet.sh เพื่อให้กลายเป็นไฟล์ที่รันได้ จากนั้นทำการเช็คไฟล์ APK วิธีการใช้สคริปต์นี้ผมเห็นว่าแสดงผลได้ละเอียดเพราะจะแสดงไลบรารีในแอพนั้นที่ใช้มาทั้งหมด

pbrobo@pbrobo-ThinkPad-P52:~/scripts$ ./check_elf_alignment.sh /media/pbrobo/backupData/sourcecodes/dart_flutter/surveystar_quick_tm_branch_4/build/app/outputs/flutter-apk/app-debug.apk

Recursively analyzing /media/pbrobo/backupData/sourcecodes/dart_flutter/surveystar_quick_tm_branch_4/build/app/outputs/flutter-apk/app-debug.apk

NOTICE: Zip alignment check requires build-tools version 35.0.0-rc3 or higher.
  You can install the latest build-tools by running the below command
  and updating your $PATH:

    sdkmanager "build-tools;35.0.0-rc3"

=== ELF alignment ===
/tmp/app-debug_out_NDws1/lib/arm64-v8a/libsqlite3.so: UNALIGNED (2**12)
/tmp/app-debug_out_NDws1/lib/arm64-v8a/libproj.so: UNALIGNED (2**12)
/tmp/app-debug_out_NDws1/lib/x86_64/libsqlite3.so: UNALIGNED (2**12)
/tmp/app-debug_out_NDws1/lib/x86_64/libproj.so: UNALIGNED (2**12)
/tmp/app-debug_out_NDws1/lib/x86_64/libflutter.so: ALIGNED (2**16)
/tmp/app-debug_out_NDws1/lib/x86/libsqlite3.so: UNALIGNED (2**12)
/tmp/app-debug_out_NDws1/lib/x86/libproj.so: UNALIGNED (2**12)
/tmp/app-debug_out_NDws1/lib/x86/libflutter.so: ALIGNED (2**16)
Found 6 unaligned libs (only arm64-v8a/x86_64 libs need to be aligned).
=====================
pbrobo@pbrobo-ThinkPad-P52:~/scripts$ 

ตอนนี้ชัดเจนแล้วว่าไลบรารี libproj.so และ libsqlite3.so ไม่ผ่านเกณฑ์ (2**12)

คอมไพล์ PROJ 9.6.0

ต่อไปจะเป็นการคอมไพล์ libproj และ libsqlite3 โดยกลับไปใช้สคริปต์เก่า แต่ครั้งนี้จะไม่คอมไพล์เป็น armeabi-v7a และ X86 ที่เป็น 32 บิต คงไม่ได้ใช้กันอีกแล้ว ผมได้ตัดสินใจถอนการสนับสนุน ไม่มีการบิวท์ไปกับแอพรุ่นใหม่ ผมได้ดัดแปลงสคริปต์เก่า โดยตัด ccache (cache compiler) เนื่องจากสร้างความยุ่งยากให้ผม จากนั้นผมใส่ URL ของไฟล์ที่จะดาวน์โหลดเช่น PROJ ที่ปัจจุบันเป็นรุ่น 9.6.0 ไว้ในไฟล์สครปต์

และใช้ทูลส์ตัวใหม่คือ Cmake รุ่น 4.0.2 และ Android NDK รุ่น r28b ส่วนตัว Sqlite3 ผมเลือกใช้รุ่นเก่า รุ่น 3430100 รุ่นในขณะที่เขียนบทความคือ 3490200 เนื่องจากพบปัญหา ถ้าใช่รุ่นใหม่ เมื่อตอนรันแอพ libproj.so จะฟ้องว่าหาไลบรารี libsqlite3.so ไม่เจอ error แจ้งว่าไม่พบไฟล์ libsqlite3.so ที่ไดเรคทอรี “tmp/install/lib” ซึ่งเป็นปลายทางที่ผมคอนไพล์ไปเก็บไว้ อิหยังอะ งงจัดแต่ไม่มีเวลาตามแกะมากนัก อีกอย่าง libproj ใช้ libsqlite3 แค่อ่านเขียนไฟล์ proj.db ก็ไม่น่าจะมีอะไร

สคริปต์สำหรับคอมไพล์

ต่อไปมาดูสคริปต์ จะมีไฟล์ buildproj4_v8a.sh สำหรับคอมไพล์ไปใช้ในเครื่องแอนดรอยด์จริงๆ เมื่อผู้ใช้ติดตั้งแล้ว ส่วน buildproj4_x86_64.sh สำหรับคอมไพล์ใช้สำหรับอีมูเลเตอร์สำหรับผู้พัฒนาซึ่งก็หมายถึงผมเอง เริ่มจาก buildproj4_x86_64.sh

#!/bin/sh
### buildproj4_x86_64.sh ###

set -e

apt-get update -y

# pkg-config sqlite3 for proj compilation
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    wget unzip ccache curl ca-certificates \
    pkg-config make binutils sqlite3 \
    automake

cd "$WORK_DIR"


# We need a recent cmake for recent NDK versions
wget -q https://github.com/Kitware/CMake/releases/download/v4.0.2/cmake-4.0.2-linux-x86_64.tar.gz
rm -rf cmake-4.0.2-linux-x86_64
tar xzf cmake-4.0.2-linux-x86_64.tar.gz
export PATH=$PWD/cmake-4.0.2-linux-x86_64/bin:$PATH

# Download Android NDK
wget -q https://dl.google.com/android/repository/android-ndk-r28b-linux.zip
rm -rf android-ndk-r28b
unzip -q android-ndk-r28b-linux.zip

export ANDROID_NDK=$PWD/android-ndk-r28b
export NDK_TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64


rm -rf /tmp/install

# build sqlite3
wget -q https://sqlite.org/2023/sqlite-autoconf-3430100.tar.gz
rm -rf sqlite-autoconf-3430100
tar xzf sqlite-autoconf-3430100.tar.gz
cd sqlite-autoconf-3430100
CC="$NDK_TOOLCHAIN/bin/x86_64-linux-android24-clang" ./configure \
  --prefix=/tmp/install --host=x86_64-linux-android24
make -j3
make install
cd ..

# Build proj
wget -q https://download.osgeo.org/proj/proj-9.6.0.tar.gz
rm -rf proj-9.6.0
tar xzf proj-9.6.0.tar.gz
cd proj-9.6.0
mkdir build
cd build
# See later comment in GDAL build section about MAKE_FIND_ROOT_PATH_MODE_INCLUDE, CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
cmake .. \
  -DUSE_CCACHE=ON \
  -DENABLE_TIFF=OFF -DENABLE_CURL=OFF -DBUILD_APPS=OFF -DBUILD_TESTING=OFF \
  -DCMAKE_INSTALL_PREFIX=/tmp/install \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_ANDROID_NDK=$ANDROID_NDK \
  -DCMAKE_ANDROID_ARCH_ABI=x86_64 \
  -DCMAKE_SYSTEM_VERSION=24 \
  "-DCMAKE_PREFIX_PATH=/tmp/install;$NDK_TOOLCHAIN/sysroot/usr/" \
  -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=NEVER \
  -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=NEVER \
  -DEXE_SQLITE3=/usr/bin/sqlite3
make -j3
make install
cd ../..

# Build GDAL, will be failed!!!! Becasue I don't use GDAL it is OK for me.
rm -rf build_android_cmake
mkdir build_android_cmake
cd build_android_cmake

# PKG_CONFIG_LIBDIR, CMAKE_FIND_ROOT_PATH_MODE_INCLUDE, CMAKE_FIND_ROOT_PATH_MODE_LIBRARY, CMAKE_FIND_USE_CMAKE_SYSTEM_PATH
# are needed because we don't install dependencies (PROJ, SQLite3) in the NDK sysroot
# This is definitely not the most idiomatic way of proceeding...
PKG_CONFIG_LIBDIR=/tmp/install/lib/pkgconfig cmake .. \
 -DUSE_CCACHE=ON \
 -DCMAKE_INSTALL_PREFIX=/tmp/install \
 -DCMAKE_SYSTEM_NAME=Android \
 -DCMAKE_ANDROID_NDK=$ANDROID_NDK \
 -DCMAKE_ANDROID_ARCH_ABI=x86_64 \
 -DCMAKE_SYSTEM_VERSION=24 \
 "-DCMAKE_PREFIX_PATH=/tmp/install;$NDK_TOOLCHAIN/sysroot/usr/" \
 -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=NEVER \
 -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=NEVER \
 -DCMAKE_FIND_USE_CMAKE_SYSTEM_PATH=NO \
 -DSFCGAL_CONFIG=disabled \
 -DHDF5_C_COMPILER_EXECUTABLE=disabled \
 -DHDF5_CXX_COMPILER_EXECUTABLE=disabled
make -j3
make install
cd ..

และ buildproj4_v8a.sh

#!/bin/sh
### buildproj4_v8a.sh ###

set -e
apt-get update -y

# pkg-config sqlite3 for proj compilation
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    wget unzip ccache curl ca-certificates \
    pkg-config make binutils sqlite3 \
    automake

cd "$WORK_DIR"

# We need a recent cmake for recent NDK versions
wget -q https://github.com/Kitware/CMake/releases/download/v4.0.2/cmake-4.0.2-linux-x86_64.tar.gz
tar xzf cmake-4.0.2-linux-x86_64.tar.gz
rm -rf cmake-4.0.2-linux-x86_64
export PATH=$PWD/cmake-4.0.2-linux-x86_64/bin:$PATH

# Download Android NDK
wget -q https://dl.google.com/android/repository/android-ndk-r28b-linux.zip
rm -rf android-ndk-r28b
unzip -q android-ndk-r28b-linux.zip

export ANDROID_NDK=$PWD/android-ndk-r28b
export NDK_TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64


rm -rf /tmp/install
# build sqlite3
wget -q https://sqlite.org/2023/sqlite-autoconf-3430100.tar.gz
rm -rf sqlite-autoconf-3430100
tar xzf sqlite-autoconf-3430100.tar.gz
cd sqlite-autoconf-3430100
CC="$NDK_TOOLCHAIN/bin/aarch64-linux-android24-clang" ./configure \
  --prefix=/tmp/install --host=aarch64-linux-android24
make -j3
make install
cd ..

# Build proj
wget -q https://download.osgeo.org/proj/proj-9.6.0.tar.gz
rm -rf proj-9.6.0
tar xzf proj-9.6.0.tar.gz
cd proj-9.6.0
mkdir build
cd build
# See later comment in GDAL build section about MAKE_FIND_ROOT_PATH_MODE_INCLUDE, CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
cmake .. \
  -DUSE_CCACHE=ON \
  -DENABLE_TIFF=OFF -DENABLE_CURL=OFF -DBUILD_APPS=OFF -DBUILD_TESTING=OFF \
  -DCMAKE_INSTALL_PREFIX=/tmp/install \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_ANDROID_NDK=$ANDROID_NDK \
  -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
  -DCMAKE_SYSTEM_VERSION=24 \
  "-DCMAKE_PREFIX_PATH=/tmp/install;$NDK_TOOLCHAIN/sysroot/usr/" \
  -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=NEVER \
  -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=NEVER \
  -DEXE_SQLITE3=/usr/bin/sqlite3
make -j3
make install
cd ../..

# Build GDAL, it will be failed!!!!!! I don't use GDAL so this is OK.
rm -rf build_android_cmake
mkdir build_android_cmake
cd build_android_cmake

# PKG_CONFIG_LIBDIR, CMAKE_FIND_ROOT_PATH_MODE_INCLUDE, CMAKE_FIND_ROOT_PATH_MODE_LIBRARY, CMAKE_FIND_USE_CMAKE_SYSTEM_PATH
# are needed because we don't install dependencies (PROJ, SQLite3) in the NDK sysroot
# This is definitely not the most idiomatic way of proceeding...
PKG_CONFIG_LIBDIR=/tmp/install/lib/pkgconfig cmake .. \
 -DUSE_CCACHE=ON \
 -DCMAKE_INSTALL_PREFIX=/tmp/install \
 -DCMAKE_SYSTEM_NAME=Android \
 -DCMAKE_ANDROID_NDK=$ANDROID_NDK \
 -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
 -DCMAKE_SYSTEM_VERSION=24 \
 "-DCMAKE_PREFIX_PATH=/tmp/install;$NDK_TOOLCHAIN/sysroot/usr/" \
 -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=NEVER \
 -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=NEVER \
 -DCMAKE_FIND_USE_CMAKE_SYSTEM_PATH=NO \
 -DSFCGAL_CONFIG=disabled \
 -DHDF5_C_COMPILER_EXECUTABLE=disabled \
 -DHDF5_CXX_COMPILER_EXECUTABLE=disabled
make -j3
make install
cd ..

วิธีการใช้งาน สร้างไดเรคทอรีเปล่าๆสำหรับไฟล์สองคริปต์นี้ แล้ว copy ไฟล์นี้ไปใส่ เปิด terminal มาทำการรันดังคำสั่งถัดไป

pbrobo@pbrobo-ThinkPad-P52:~/buildProj4$ sudo ./buildproj4_v8a.sh
pbrobo@pbrobo-ThinkPad-P52:~/buildProj4$ sudo ./buildproj4_x86_64.sh

เมื่อรันสคริปต์แต่ละครั้งจะมี error เกิดขึ้นตอนท้ายๆ เพราะสคริปต์พยายามสร้างไลบรารีสำหรับ GDAL ซึ่งสคริปต์นี้ผมเอามาจากท่านอื่นแต่ไม่ได้ลบในส่วนนี้ออก

CMake Error: The source directory "/home/pbrobo/buildProj4" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.

การทดสอบไลบรารีก่อนนำไปใช้งาน

ผลลัพธ์คือไลบรารี libproj.so และ libsqilte3.so จะถูกจัดเก็บชั่วคราวที่ไดเรคทอรี “/tmp/install” ต่อไปจะทดสอบว่าสองไลบรารีนี้จะผ่านข้อกำหนดกูเกิ้ลหรือไม่ ผมจะทำการทดสอบด้วยคำสั่ง llvm-objdump ได้ผลลัพธ์ 2**14 ซึ่งผ่าน

pbrobo@pbrobo-ThinkPad-P52:/tmp/install/lib$ llvm-objdump -p libproj.so | grep LOAD
    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14
    LOAD off    0x000000000043ca10 vaddr 0x0000000000440a10 paddr 0x0000000000440a10 align 2**14
    LOAD off    0x00000000004607c0 vaddr 0x00000000004687c0 paddr 0x00000000004687c0 align 2**14
pbrobo@pbrobo-ThinkPad-P52:/tmp/install/lib$ llvm-objdump -p libsqlite3.so | grep LOAD
    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14
    LOAD off    0x000000000003e0ec vaddr 0x00000000000420ec paddr 0x00000000000420ec align 2**14
    LOAD off    0x0000000000170a90 vaddr 0x0000000000178a90 paddr 0x0000000000178a90 align 2**14
    LOAD off    0x0000000000173560 vaddr 0x000000000017f560 paddr 0x000000000017f560 align 2**14
pbrobo@pbrobo-ThinkPad-P52:/tmp/install/lib$ 

แค่นี้ก็เพียงพอจะนำไปใช้งานได้ จากนั้นทำการคัดลอกไฟล์ที่ได้ไปใช้งาน

และผมยัง copy สองไดเรคทอรีคือ share และ include ไปด้วย

การนำไลบรารีที่คอมไพล์แล้วไปใช้งาน

สำหรับปลายทางที่ผมเอาไปใช้ในโครงการที่พัฒนาด้วยภาษาดาร์ท (Dart) ขึ้น UI ด้วย Flutter พัฒนาใน VS Code ผมมี package ชื่อ proj4 แล้วเอาไฟล์ที่ได้ไปใส่ให้ถูกที่ดังรูป ไม่งั้นแอพจะหาไลบรารีไม่เจอ

ทดสอบ APK

ผมบิวท์แอพด้วยคำสั่ง flutter build apk เพื่อเอาไฟล์ apk มาทดสอบด้วยสคริปต์ check_elf_alignment.sh ได้ผลดังนี้

pbrobo@pbrobo-ThinkPad-P52:~/scripts$ ./check_elf_alignment.sh /media/pbrobo/Dev/dev/dart/surveystar_quick_tm_branch_5/build/app/outputs/flutter-apk/app-release.apk

Recursively analyzing /media/pbrobo/Dev/dev/dart/surveystar_quick_tm_branch_5/build/app/outputs/flutter-apk/app-release.apk

NOTICE: Zip alignment check requires build-tools version 35.0.0-rc3 or higher.
  You can install the latest build-tools by running the below command
  and updating your $PATH:

    sdkmanager "build-tools;35.0.0-rc3"

=== ELF alignment ===
/tmp/app-release_out_Z2WF3/lib/arm64-v8a/libapp.so: ALIGNED (2**16)
/tmp/app-release_out_Z2WF3/lib/arm64-v8a/libsqlite3.so: ALIGNED (2**14)
/tmp/app-release_out_Z2WF3/lib/arm64-v8a/libdatastore_shared_counter.so: ALIGNED (2**14)
/tmp/app-release_out_Z2WF3/lib/arm64-v8a/libproj.so: ALIGNED (2**14)
/tmp/app-release_out_Z2WF3/lib/arm64-v8a/libflutter.so: ALIGNED (2**16)
/tmp/app-release_out_Z2WF3/lib/x86_64/libapp.so: ALIGNED (2**16)
/tmp/app-release_out_Z2WF3/lib/x86_64/libsqlite3.so: ALIGNED (2**14)
/tmp/app-release_out_Z2WF3/lib/x86_64/libdatastore_shared_counter.so: ALIGNED (2**14)
/tmp/app-release_out_Z2WF3/lib/x86_64/libproj.so: ALIGNED (2**14)
/tmp/app-release_out_Z2WF3/lib/x86_64/libflutter.so: ALIGNED (2**16)
ELF Verification Successful
=====================
pbrobo@pbrobo-ThinkPad-P52:~/scripts$ 

จะเห็นว่าไฟล์ไลรารี libproj.so และ libsqlite3.so ในไดเรคทอรี lib/arm64-v8a/ และ lib/x86_64 นั้นผ่านแล้ว (2**14) แสดงว่าผ่านข้อกำหนดของกูเกิ้ลแล้ว

ในบรรณพิภพนี้คงหาไลบรารีไหนที่จะมาวัดกับ PROJ ตัวต่อตัวได้เนื่องจากพัฒนามายาวนานหลายสิบปีที่อาศัยคนระดับหัวกะทิมาช่วยกันพัฒนาและยังเปิดซอร์สอีก ส่งผลให้โปรแกรมเปิดซอร์สอื่นๆเช่น QGIS ที่นำไลบรารีไปใช้ในการแปลงระบบพิกัดต่างๆทั้งโลก การแปลงรูปจากระบบพิกัดหนึ่งไปอีกพิกัดหนึ่งก็เช่นเดียวกันถึงแม้ส่วนนี้จะใช้ไลบรารี GDAL แต่ GDAL ก็ใช้ PROJ อยู่ดี

ทำให้นักพัฒนาเช่น QGIS ไม่ต้องมาเสียเวลากับเรื่องนี้เพราะว่า PROJ จัดการให้หมด ทำให้ QGIS เป็นโปรแกรมเปิดซอร์สที่ผมยังใช้อยู่ในปัจจุบัน และก็ดีมากๆ ตัวอย่างสามารถเปิดรูป orthophoto ขนาด 32 GB ได้แบบสบายๆ จะเปิดแบบไดรว์ส่วนตัวหรือจะเปิดผ่านไดรว์ NAS ก็ไม่เกี่ยง ถ้าเอาไฟล์ขนาดนี้มาเปิดในโปรแกรม CAD ไม่ว่าค่ายไหน เดี้ยงทันที จอดไม่ต้องแจวกันเลย

Rust & PROJ

เนื่องจากผมใช้ภาษา Rust ก่อนหน้านี้ผมลองไลบรารีหรือเครท (crate) Geodesy แต่พบว่าไปไม่สุดซอย จำใจต้องกลับมาหาเพื่อนเก่า PROJ เหมือนเดิม ถึงแม้จะมีคนสร้าง crate ชื่อ “proj” และ “proj-sys” มาให้ก็ตาม แต่การ config เพื่อคอมไพล์ไลบรารีมาใช้กับ Rust บน Desktop PC ไม่ได้ตรงไปตรงมา คือหาเอกสารอ่านได้น้อย ผมลองผิดลองถูกอยู่นานพอสมควร

ตอนหน้าอาจจะมาว่าด้วยเรื่องการคอมไพล์ PROJ เพื่อใช้กับ Rust และอนาคตอาจจะยาวไปถึงขั้นเอาไปใช้บนแอนดรอยด์กับ Rust ผ่านแพลตฟอร์มเช่น Dioxus หรืออาจจะเป็น Slint ก็เป็นได้ โปรดติดตามกันตอนหน้าครับ

Related

2 thoughts on “คอมไพล์ PROJ 9.6.0 สำหรับแอนดรอยด์ แก้ปัญหาเพิ่มขนาด page size 16KB ตามกฎใหม่ของกูเกิ้ล”

  1. Media says:
    28/05/2025 at 13:28

    การใช้งานสคริปต์นี้ดูน่าสนใจมาก โดยเฉพาะการที่คุณได้ลองใช้ไลบรารีต่าง ๆ และพบปัญหาที่ต้องแก้ไขเอง ผมคิดว่าการที่คุณเลือกกลับมาใช้ PROJ นั้นเป็นทางเลือกที่ดี เพราะมันน่าจะมีความเสถียรและน่าเชื่อถือมากกว่า การที่คุณลองผิดลองถูกอยู่นานก็แสดงให้เห็นถึงความพยายามและความอดทน ผมสงสัยว่าการคอมไพล์ PROJ เพื่อใช้กับ Rust นั้นมีขั้นตอนที่ยุ่งยากมากแค่ไหน และคุณคิดว่ามันจะสามารถนำไปใช้บนแพลตฟอร์มอื่น ๆ ได้ง่ายหรือไม่? ผมอยากรู้ว่าคุณมีแผนที่จะเขียนบทความเกี่ยวกับการนำ PROJ ไปใช้บนแอนดรอยด์หรือไม่ เพราะมันน่าจะเป็นประโยชน์สำหรับคนที่สนใจในเรื่องนี้ ผมคิดว่าคุณควรจะแบ่งปันประสบการณ์และความรู้เพิ่มเติมในบทความต่อไป เพราะมันจะช่วยให้คนอื่น ๆ ที่กำลังเจอปัญหาคล้าย ๆ กันได้เรียนรู้และพัฒนาตัวเองได้มากขึ้น คุณคิดว่าอย่างไร?

    Reply
    1. priabroy says:
      29/05/2025 at 13:58

      ใช่ครับ ผมคิดว่าการใช้งาน PROJ นั้นเป็นตัวเลือกที่ดีที่สุด เป็นมืออาชีพมากที่สุด ก่อนหน้านี้ผมพัฒนาแอพบนแอนดรอยด์ผมใช้ Dart/Flutter ซึ่งไม่มีปัญหาอะไร สามารถ compile & build ไลบรารี PROJ ไปใช้ได้อย่างสบายด้วยสคริปต์คล้ายๆกัน ในขณะเดียวกันผมสนใจภาษา Rust กำลังศึกษาอยู่ต้องการนำภาษา Rust ไปใช้พัฒนาโปรแกรมต่างๆ เพื่อฝึกฝนให้มีทักษะและความชำนาญ ผมไม่ได้มีอาชีพโดยตรงกับการพัฒนาแอพ แต่อาศัยเวลาว่างและความชอบในการโปรแกรมมิ่ง ถ้าพอมีอะไรที่ผมแบ่งปันให้ได้ก็จะแบ่งปันเท่าที่กำลังจะมี เท่าที่ทราบตอนนี้ Rust ยังไม่เหมาะที่จะเขียนแอพบนโทรศัพท์แอนดรอยด์เนื่องจากเครื่องมือต่างๆที่ใช้ในการพัฒนายังไม่พร้อมเช่น Dioxus หรือ Slint คงอีกสักพักใหญ่ๆ ขอบคุณครับที่ทักทายกันมา

      Reply

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

September 2026
M T W T F S S
 123456
78910111213
14151617181920
21222324252627
282930  
« Aug    

Blog Stats

  • 886,564 hits

Recent Posts

  • ประสบการณ์ใช้งาน Kimi K3 Code เขมือบแบบสยอง
  • สร้างแพลตฟอร์มดู Point Cloud บนเว็บด้วย Potree + CesiumJS — เรื่องเล่าจากสนามบินอู่ตะเภา
  • เมื่อวิศวกรสำรวจคำนวณเรื่องน้ำ – วิเคราะห์ระบบระบายน้ำบริเวณ RESA
  • แนะนำหนังสือ “จีออเดซี” ที่ยอดเยี่ยมของดร.พุทธิพล
  • ESPrtk ทำให้ ESP32 ใช้ไม่ได้? วิธีกู้คืน
  • กรณีศึกษา – คืนชีพ SDL30 ปี 2000 ด้วย ESP32 และแอพทำเอง SDL30 Collector
  • DIY RTK Base Station (survey-grade) รุ่น V3.21 ด้วย Raspberry Pi 2B + UM980 เมื่อคุณปู่กลับมาเป็นฮีโร่ ตอนที่ 4
  • รีวิวกูปรี (CoPre2) โปรแกรมประมวลผลไลดาร์จากค่าย CHCNav
  • DIY RTK Base Station (survey-grade) รุ่น V3.2 ด้วย Orange Pi 3 Zero + UM980 ตอนที่ 3
  • DIY RTK Base Station (survey-grade) รุ่น V3 ด้วย Orange Pi 3 Zero + UM980 ตอนที่ 2
  • เส้นทางและไทม์ไลน์ของใบรับรองความรู้ความชำนาญในการประกอบอาชีพวิศวกรรม(สำรวจ)ระดับวิศวกรวิชาชีพ
  • มัดแหนมรวมสามโปรแกรมไปใช้บนสโตร์ Snap ฝั่งลีนุกซ์
  • ปัดฝุ่น Traverse Pro เพิ่มรายละเอียดรายการคำนวณใหม่แบบแนวนอน (Landscape) และธีมมืด
  • DIY RTK Base Station (Survey-Grade) ด้วยชิป UM980 และบอร์ด ESP32 ตอนที่ 1
  • สร้าง NTRIP Caster ด้วย BNC บนคลาวด์แบบ DIY สำหรับ RTK Base Station ใช้ CHCNav P5
  • จับ AI มาไตรกรีฬา สร้างตัวติดตั้ง Snap สำหรับ Surveyor Pocket Tools กับประเด็นแฝงเร้นความเป็นส่วนตัวของผู้ใช้
  • ทดสอบรีด QGIS แบบโหดสัสด้วยชุดข้อมูล Open Building V3 โพลีกอน 74 ล้านหลัง
  • เมื่อ AI เป็นพิษชักจูงผู้ใช้ด้วยข้อมูลผิดๆ
  • เมื่อ AI กลายเป็นพิษด้วยอัตตา
  • คอมไพล์ PROJ 9.6.0 สำหรับแอนดรอยด์ แก้ปัญหาเพิ่มขนาด page size 16KB ตามกฎใหม่ของกูเกิ้ล
  • เครื่องมือช่วยออกแบบเส้นโครงแผนที่ความคลาดเคลื่อนต่ำ ด้วย LDP Companion เพื่อนคู่คิดมิตรคู่ใจ (#กำลังพัฒนา #Rust #Slint)
  • #Update แก้บั๊กหลุมดำ Surveyor Pocket Tools
  • ปฐมฤกษ์โปรแกรมเดสก์ท็อปภาษา Rust ด้วย Slint
  • การตั้ง Heading จาก RTK GNSS สองเครื่องใน Hypack
  • วิธีการออกแบบและรังวัดโครงข่าย GNSS ฉบับคนเดินถนน (ตอนที่ 3)

Subscribe to Blog via Email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 118 other subscribers

Archives

  • August 2026
  • July 2026
  • May 2026
  • April 2026
  • March 2026
  • January 2026
  • December 2025
  • November 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • July 2024
  • May 2024
  • April 2024
  • January 2024
  • November 2023
  • October 2023
  • September 2023
  • July 2023
  • June 2023
  • May 2023
  • March 2023
  • February 2023
  • January 2023
  • November 2022
  • October 2022
  • September 2022
  • July 2022
  • May 2022
  • December 2021
  • October 2021
  • September 2021
  • August 2021
  • May 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • September 2019
  • August 2019
  • July 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
  • January 2018
  • November 2017
  • July 2017
  • June 2017
  • May 2017
  • April 2017
  • March 2017
  • February 2017
  • January 2017
  • December 2016
  • November 2016
  • October 2016
  • August 2016
  • November 2015
  • March 2015
  • August 2014
  • March 2014
  • January 2014
  • December 2013
  • February 2012
  • January 2012
  • November 2011
  • October 2011
  • August 2011
  • April 2011
  • February 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • June 2010
  • April 2010
  • March 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • September 2009
  • August 2009

Recent Comments

  • 63.013_Sor Saimai on การออกแบบเส้นโครงแผนที่ความเพี้ยนต่ำ (Low Distortion Projection) ตอนที่ 2 (กรณีศึกษาออกแบบเส้นโครงแผนที่ความเพี้ยนต่ำสำหรับกรุงเทพมหานครและปริมณฑล)
  • priabroy on แปลงรูปแบบไฟล์แบบจำลองความสูงจีออยด์ TGM2017 เป็น GGF เพื่อใช้ในโปรแกรม Trimble Business Center
  • priabroy on แปลงรูปแบบไฟล์แบบจำลองความสูงจีออยด์ TGM2017 เป็น GGF เพื่อใช้ในโปรแกรม Trimble Business Center
  • Thanom Sriworasa on แปลงรูปแบบไฟล์แบบจำลองความสูงจีออยด์ TGM2017 เป็น GGF เพื่อใช้ในโปรแกรม Trimble Business Center
  • priabroy on ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 7 โปรแกรมคำนวณโค้งราบ (Horizontal Curve)
©2026 Prajuab Riabroy's Blog | Design: Newspaperly WordPress Theme