Skip to content

Commit

Permalink
Merge pull request #27 from koreader/chrox-master
Browse files Browse the repository at this point in the history
Implement io.popen
  • Loading branch information
hwhw committed Apr 15, 2015
2 parents 0204efb + 5441558 commit a00e3d1
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 0 deletions.
1 change: 1 addition & 0 deletions AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
android:versionName="1.0">
<uses-sdk android:minSdkVersion="9" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:label="@string/app_name"
android:hasCode="false" android:debuggable="true"
Expand Down
139 changes: 139 additions & 0 deletions assets/android.lua
Original file line number Diff line number Diff line change
Expand Up @@ -991,21 +991,63 @@ end
function JNI:callObjectMethod(object, method, signature, ...)
local clazz = self.env[0].GetObjectClass(self.env, object)
local methodID = self.env[0].GetMethodID(self.env, clazz, method, signature)
self.env[0].DeleteLocalRef(self.env, clazz)
return self.env[0].CallObjectMethod(self.env, object, methodID, ...)
end

function JNI:callIntMethod(object, method, signature, ...)
local clazz = self.env[0].GetObjectClass(self.env, object)
local methodID = self.env[0].GetMethodID(self.env, clazz, method, signature)
self.env[0].DeleteLocalRef(self.env, clazz)
return self.env[0].CallIntMethod(self.env, object, methodID, ...)
end

function JNI:callStaticIntMethod(class, method, signature, ...)
local clazz = self.env[0].FindClass(self.env, class)
local methodID = self.env[0].GetStaticMethodID(self.env, clazz, method, signature)
self.env[0].DeleteLocalRef(self.env, clazz)
return self.env[0].CallStaticIntMethod(self.env, clazz, methodID, ...)
end

function JNI:callStaticBooleanMethod(class, method, signature, ...)
local clazz = self.env[0].FindClass(self.env, class)
local methodID = self.env[0].GetStaticMethodID(self.env, clazz, method, signature)
local res = self.env[0].CallStaticBooleanMethod(self.env, clazz, methodID, ...)
self.env[0].DeleteLocalRef(self.env, clazz)
return res
end

function JNI:callStaticObjectMethod(class, method, signature, ...)
local clazz = self.env[0].FindClass(self.env, class)
local methodID = self.env[0].GetStaticMethodID(self.env, clazz, method, signature)
local res = self.env[0].CallStaticObjectMethod(self.env, clazz, methodID, ...)
self.env[0].DeleteLocalRef(self.env, clazz)
return res
end

function JNI:getObjectField(object, field, signature)
local clazz = self.env[0].GetObjectClass(self.env, object)
local fieldID = self.env[0].GetFieldID(self.env, clazz, field, signature)
self.env[0].DeleteLocalRef(self.env, clazz)
return self.env[0].GetObjectField(self.env, object, fieldID)
end

function JNI:setObjectField(object, field, signature, value)
local clazz = self.env[0].GetObjectClass(self.env, object)
local fieldID = self.env[0].GetFieldID(self.env, clazz, field, signature)
self.env[0].SetObjectField(self.env, object, fieldID, value)
self.env[0].DeleteLocalRef(self.env, clazz)
return object
end

function JNI:setFloatField(object, field, signature, value)
local clazz = self.env[0].GetObjectClass(self.env, object)
local fieldID = self.env[0].GetFieldID(self.env, clazz, field, signature)
self.env[0].SetFloatField(self.env, object, fieldID, value)
self.env[0].DeleteLocalRef(self.env, clazz)
return object
end

function JNI:to_string(javastring)
local utf = self.env[0].GetStringUTFChars(self.env, javastring, nil)
local luastr = ffi.string(utf, self.env[0].GetStringUTFLength(self.env, javastring))
Expand Down Expand Up @@ -1153,9 +1195,106 @@ local function run(android_app_state)
JNI:callIntMethod(display, "getWidth", "()I"),
JNI:callIntMethod(display, "getHeight", "()I")
end)
android.get_screen_brightness = function()
return JNI:context(android.app.activity.vm, function(JNI)
local str_brightness = JNI.env[0].NewStringUTF(JNI.env, "screen_brightness")
local res = JNI:callStaticIntMethod(
"android/provider/Settings$System",
"getInt",
"(Landroid/content/ContentResolver;Ljava/lang/String;)I",
JNI:callObjectMethod(
android.app.activity.clazz,
"getContentResolver",
"()Landroid/content/ContentResolver;"
),
str_brightness
)
JNI.env[0].DeleteLocalRef(JNI.env, str_brightness)
return res
end)
end
android.set_screen_brightness = function(brightness)
android.LOGI("set screen brightness "..brightness)
return JNI:context(android.app.activity.vm, function(JNI)
local str_brightness = JNI.env[0].NewStringUTF(JNI.env, "screen_brightness")
local res = JNI:callStaticBooleanMethod(
"android/provider/Settings$System",
"putInt",
"(Landroid/content/ContentResolver;Ljava/lang/String;I)Z",
JNI:callObjectMethod(
android.app.activity.clazz,
"getContentResolver",
"()Landroid/content/ContentResolver;"
),
str_brightness,
brightness
)
JNI.env[0].DeleteLocalRef(JNI.env, str_brightness)
--[[
if res then
local window = JNI:callObjectMethod(
android.app.activity.clazz,
"getWindow",
"()Landroid/view/Window;"
)
JNI:callObjectMethod(
window,
"setAttributes",
"(Landroid/view/WindowManager$LayoutParams;)V",
JNI:setFloatField(JNI:callObjectMethod(
window,
"getAttributes",
"()Landroid/view/WindowManager$LayoutParams;"
), "screenBrightness", "F", brightness/255)
)
end
--]]
return res
end)
end
io.popen = function(prog, mode)
mode = mode or "r"
if mode ~= "r" then
android.LOGI("io.popen currently only supports read mode")
return
end
android.LOGI("run program "..prog)
return JNI:context(android.app.activity.vm, function(JNI)
local program = JNI.env[0].NewStringUTF(JNI.env, prog)
local stdout = JNI:callObjectMethod(
JNI:callObjectMethod(
JNI:callStaticObjectMethod(
"java/lang/Runtime",
"getRuntime",
"()Ljava/lang/Runtime;"
),
"exec",
"(Ljava/lang/String;)Ljava/lang/Process;",
program
),
"getInputStream",
"()Ljava/io/InputStream;"
)
local tmp_file = android.dir .. "/io.popen.tmp"
local tmp = io.open(tmp_file, "w")
while true do
local char = JNI:callIntMethod(stdout, "read", "()I")
if char >= 0 then
tmp:write(string.char(char))
else
tmp:close()
break
end
end
JNI.env[0].DeleteLocalRef(JNI.env, program)
JNI.env[0].DeleteLocalRef(JNI.env, stdout)
return io.open(tmp_file, "r")
end)
end
android.LOGI("Application data directory "..android.dir)
android.LOGI("Application library directory "..android.nativeLibraryDir)
android.LOGI("Screen size "..android.screen.width.."x"..android.screen.height)
android.LOGI("Screen brightness "..android.get_screen_brightness())

-- register the "android" module (ourself)
package.loaded.android = android
Expand Down

0 comments on commit a00e3d1

Please sign in to comment.