package("pine") set_homepage("https://github.com/canyie/pine") set_description("Dynamic java method hook framework on ART. Allowing you to change almost all java methods' behavior dynamically.") add_urls("https://github.com/canyie/pine.git", {submodules = false}) add_versions("2025.11.08", "216d910f18b18430a5d21c510affb221a9833a55") add_deps("xz-embedded", "dobby") on_install("android", function (package) os.cd("core/src/main/cpp") io.replace("utils/scoped_local_ref.h", [[#include "macros.h"]], [[#include "macros.h" #include ]], {plain = true}) local configs = {} io.writefile("xmake.lua", [[ add_rules("mode.release", "mode.debug") set_languages("c++17") add_requires("xz-embedded", "dobby") target("pine") set_kind("$(kind)") add_headerfiles( "(*.h)", "(art/*.h)", "(trampoline/*.h)", "(trampoline/arch/*.h)", "(utils/*.h)", {prefixdir = "pine"}) add_files( "pine.cpp", "ruler.cpp", "android.cpp", "jni_bridge.cpp", "art/art_method.cpp", "art/thread.cpp", "art/jit.cpp", "trampoline/trampoline_installer.cpp", "utils/memory.cpp", "utils/scoped_memory_access_protection.cpp", "utils/elf_image.cpp", "utils/well_known_classes.cpp") if is_arch("armeabi-v7a", "armv7-a") then add_asflags("-arch armv7") add_files( "trampoline/arch/thumb2.cpp", "trampoline/arch/thumb2.S") elseif is_arch("arm64-v8a", "arm64") then add_asflags("-arch arm64") add_files( "trampoline/arch/arm64.cpp", "trampoline/arch/arm64.S") elseif is_arch("x86", "i386") then add_asflags("-arch x86") add_files("trampoline/arch/x86.cpp") end add_syslinks("log") add_packages("xz-embedded") target("pine-enhances") set_kind("$(kind)") add_files("enhances.cpp") add_syslinks("log") add_packages("dobby") ]]) import("package.tools.xmake").install(package) end) on_test(function (package) assert(package:check_cxxsnippets({test = [[ #include void test() { pine::art::ArtMethod* method = pine::art::ArtMethod::New(); } ]]}, {configs = {languages = "c++17"}})) end)