mirror of https://github.com/koreader/koreader
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.9 KiB
Lua
63 lines
1.9 KiB
Lua
local A = require("android")
|
|
A.dl.library_path = A.dl.library_path .. ":" .. A.dir .. "/libs"
|
|
|
|
local ffi = require("ffi")
|
|
ffi.cdef[[
|
|
char *getenv(const char *name);
|
|
int putenv(const char *envvar);
|
|
void *mmap(void *addr, size_t length, int prot, int flags, int fd, size_t offset);
|
|
int munmap(void *addr, size_t length);
|
|
]]
|
|
|
|
-- check uri of the intent that starts this application
|
|
local file = A.jni:context(A.app.activity.vm, function(JNI)
|
|
local uri = JNI:callObjectMethod(
|
|
JNI:callObjectMethod(
|
|
A.app.activity.clazz,
|
|
"getIntent",
|
|
"()Landroid/content/Intent;"
|
|
),
|
|
"getData",
|
|
"()Landroid/net/Uri;"
|
|
)
|
|
if uri ~= nil then
|
|
local path = JNI:callObjectMethod(
|
|
uri,
|
|
"getPath",
|
|
"()Ljava/lang/String;"
|
|
)
|
|
return JNI:to_string(path)
|
|
end
|
|
end)
|
|
A.LOGI("intent file path " .. (file or ""))
|
|
|
|
-- reservation enough mmap slots for mcode allocation
|
|
local reserved_slots = {}
|
|
for i = 1, 32 do
|
|
local len = 0x80000 + i*0x2000
|
|
local p = ffi.C.mmap(nil, len, 0x3, 0x22, -1, 0)
|
|
A.LOGI("mmapped " .. tostring(p))
|
|
table.insert(reserved_slots, {p = p, len = len})
|
|
end
|
|
-- free the reservation immediately
|
|
for _, slot in ipairs(reserved_slots) do
|
|
local res = ffi.C.munmap(slot.p, slot.len)
|
|
A.LOGI("munmap " .. tostring(slot.p) .. " " .. res)
|
|
end
|
|
-- and allocate a large mcode segment, hopefully it will success.
|
|
require("jit.opt").start("sizemcode=512","maxmcode=512")
|
|
for i=1,100 do end -- Force allocation of one large segment
|
|
|
|
-- run koreader patch before koreader startup
|
|
pcall(function() dofile("/sdcard/koreader/patch.lua") end)
|
|
|
|
-- set proper permission for sdcv
|
|
A.execute("chmod", "755", "./sdcv")
|
|
|
|
-- set TESSDATA_PREFIX env var
|
|
ffi.C.putenv("TESSDATA_PREFIX=/sdcard/koreader/data")
|
|
|
|
-- create fake command-line arguments
|
|
arg = {"-d", file or "/sdcard"}
|
|
dofile(A.dir.."/reader.lua")
|