Some fixes in android sample

This commit is contained in:
Igor Chevdar
2017-06-22 13:34:22 +03:00
parent 5df86d9f17
commit 44620c1428
4 changed files with 67 additions and 51 deletions
+1 -1
View File
@@ -103,7 +103,7 @@ void runKonan_start() {
}
void putEventSynchronously(void* event) {
uint64_t value = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(event));
auto value = reinterpret_cast<uintptr_t>(event);
if (write(pipeC, &value, sizeof(value)) != sizeof(value)) {
LOGE("Failure writing event: %s\n", strerror(errno));
}
+8 -17
View File
@@ -46,10 +46,14 @@ konanArtifacts {
PolyhedronArm32 {
useInterop "arm32"
target "android_arm32"
outputDir 'PolyhedronArm32'
outputName 'libpoly'
}
PolyhedronArm64 {
useInterop "arm64"
target "android_arm64"
outputDir 'PolyhedronArm64'
outputName 'libpoly'
}
}
@@ -89,7 +93,7 @@ model {
def name = targetPlatform.getName()
def index = platforms.indexOf(name)
if (index >= 0)
sharedLibraryFile = file("build/konan/bin/${artifacts[index]}/libpoly.so")
sharedLibraryFile = file("${artifacts[index]}/libpoly.so")
}
}
}
@@ -105,26 +109,13 @@ model {
}
}
task renameArtifacts << {
for (artifact in artifacts) {
copy {
from "build/konan/bin"
into "build/konan/bin/${artifact}"
rename "${artifact}.so", "libpoly.so"
}
}
}
renameArtifacts.dependsOn "compileKonanPolyhedronArm32"
renameArtifacts.dependsOn "compileKonanPolyhedronArm64"
tasks.matching { it.name == 'preBuild' }.all {
it.dependsOn 'renameArtifacts'
it.dependsOn 'compileKonanPolyhedronArm32'
it.dependsOn 'compileKonanPolyhedronArm64'
}
task buildApk(type: DefaultTask) {
dependsOn "compileKonanPolyhedronArm32"
dependsOn "compileKonanPolyhedronArm64"
dependsOn "renameArtifacts"
dependsOn "assembleDebug"
}
}
@@ -17,11 +17,11 @@
import kotlinx.cinterop.*
import android.*
private fun logError(message: String) {
fun logError(message: String) {
__android_log_write(ANDROID_LOG_ERROR, "KonanActivity", message)
}
private fun logInfo(message: String) {
fun logInfo(message: String) {
__android_log_write(ANDROID_LOG_INFO, "KonanActivity", message)
}
@@ -42,9 +42,12 @@ fun main(args: Array<String>) {
}
}
fun <T : CPointed> CPointer<*>?.dereferenceAs(): T = this!!.reinterpret<T>().pointed
class Engine(val arena: NativePlacement, val state: NativeActivityState) {
private val renderer = Renderer(arena, state.activity!!.pointed)
private val renderer = Renderer(arena, state.activity!!.pointed, state.savedState)
private var queue: CPointer<AInputQueue>? = null
private var rendererState: COpaquePointer? = null
private var currentPoint = Vector2.Zero
private var startPoint = Vector2.Zero
@@ -60,8 +63,8 @@ class Engine(val arena: NativePlacement, val state: NativeActivityState) {
while (true) {
// Process events.
memScoped {
val fd = alloc<IntVar>()
eventLoop@while (true) {
val fd = alloc<IntVar>()
val id = ALooper_pollAll(if (needRedraw || animating) 0 else -1, fd.ptr, null, null)
if (id < 0) break@eventLoop
when (id) {
@@ -91,21 +94,24 @@ class Engine(val arena: NativePlacement, val state: NativeActivityState) {
}
private fun processSysEvent(fd: IntVar): Boolean = memScoped {
val ptr = allocArray<LongVar>(1)
val readBytes = read(fd.value, ptr, 8).toLong()
if (readBytes != 8L) {
val eventPointer = alloc<COpaquePointerVar>()
val readBytes = read(fd.value, eventPointer.ptr, pointerSize.signExtend<size_t>()).toLong()
if (readBytes != pointerSize.toLong()) {
logError("Failure reading event, $readBytes read: ${getUnixError()}")
return true
}
try {
val event = ptr[0].toCPointer<NativeActivityEvent>()!!.pointed
val event = eventPointer.value.dereferenceAs<NativeActivityEvent>()
when (event.eventKind) {
NativeActivityEventKind.START -> logInfo("START event received")
NativeActivityEventKind.DESTROY -> return false
NativeActivityEventKind.DESTROY -> {
rendererState?.let { free(it) }
return false
}
NativeActivityEventKind.NATIVE_WINDOW_CREATED -> {
val windowEvent = ptr[0].toCPointer<NativeActivityWindowEvent>()!!.pointed
val windowEvent = eventPointer.value.dereferenceAs<NativeActivityWindowEvent>()
if (!renderer.initialize(windowEvent.window!!))
return false
logInfo("Renderer initialized")
@@ -113,7 +119,7 @@ class Engine(val arena: NativePlacement, val state: NativeActivityState) {
}
NativeActivityEventKind.INPUT_QUEUE_CREATED -> {
val queueEvent = ptr[0].toCPointer<NativeActivityQueueEvent>()!!.pointed
val queueEvent = eventPointer.value.dereferenceAs<NativeActivityQueueEvent>()
if (queue != null)
AInputQueue_detachLooper(queue)
queue = queueEvent.queue
@@ -121,13 +127,23 @@ class Engine(val arena: NativePlacement, val state: NativeActivityState) {
}
NativeActivityEventKind.INPUT_QUEUE_DESTROYED -> {
val queueEvent = ptr[0].toCPointer<NativeActivityQueueEvent>()!!.pointed
val queueEvent = eventPointer.value.dereferenceAs<NativeActivityQueueEvent>()
AInputQueue_detachLooper(queueEvent.queue)
}
NativeActivityEventKind.NATIVE_WINDOW_DESTROYED -> {
renderer.destroy()
}
NativeActivityEventKind.SAVE_INSTANCE_STATE -> {
val saveStateEvent = eventPointer.value.dereferenceAs<NativeActivitySaveStateEvent>()
val state = renderer.getState()
val dataSize = state.second.signExtend<size_t>()
rendererState = realloc(rendererState, dataSize)
memcpy(rendererState, state.first, dataSize)
saveStateEvent.savedState = rendererState
saveStateEvent.savedStateSize = dataSize
}
}
} finally {
notifySysEventProcessed()
@@ -17,16 +17,9 @@
import kotlinx.cinterop.*
import android.*
private fun logError(message: String) {
__android_log_write(ANDROID_LOG_ERROR, "KonanActivity", message)
}
private fun logInfo(message: String) {
__android_log_write(ANDROID_LOG_INFO, "KonanActivity", message)
}
class Renderer(val arena: NativePlacement, val nativeActivity: ANativeActivity) {
class Renderer(val parentArena: NativePlacement, val nativeActivity: ANativeActivity, val savedMatrix: COpaquePointer?) {
private val arena = MemScope()
private var display: EGLDisplay? = null
private var surface: EGLSurface? = null
private var context: EGLContext? = null
@@ -34,6 +27,18 @@ class Renderer(val arena: NativePlacement, val nativeActivity: ANativeActivity)
var screen = Vector2.Zero
private val matrix = parentArena.allocArray<FloatVar>(16)
init {
if (savedMatrix != null) {
memcpy(matrix, savedMatrix, 16 * 4)
} else {
for (i in 0..3)
for (j in 0..3)
matrix[i * 4 + j] = if (i == j) 1.0f else 0.0f
}
}
fun initialize(window: CPointer<ANativeWindow>): Boolean {
with(arena) {
logInfo("Initializing context..")
@@ -55,11 +60,14 @@ class Renderer(val arena: NativePlacement, val nativeActivity: ANativeActivity)
EGL_NONE
)
val numConfigs = alloc<EGLintVar>()
if (eglChooseConfig(display, attribs, null, 0, numConfigs.ptr) == 0) {
logError("eglChooseConfig()#1 returned error ${eglGetError()}")
destroy()
return false
}
val supportedConfigs = allocArray<EGLConfigVar>(numConfigs.value)
if (eglChooseConfig(display, attribs, null, 0, numConfigs.ptr) == 0
|| eglChooseConfig(display, attribs, supportedConfigs, numConfigs.value, numConfigs.ptr) == 0) {
logError("eglChooseConfig() returned error ${eglGetError()}")
if (eglChooseConfig(display, attribs, supportedConfigs, numConfigs.value, numConfigs.ptr) == 0) {
logError("eglChooseConfig()#2 returned error ${eglGetError()}")
destroy()
return false
}
@@ -138,19 +146,16 @@ class Renderer(val arena: NativePlacement, val nativeActivity: ANativeActivity)
loadTexture("kotlin_logo.bmp")
glPushMatrix()
glLoadIdentity()
glGetFloatv(GL_MODELVIEW_MATRIX, matrix)
glPopMatrix()
initialized = true
return true
}
}
private val matrix = arena.allocArray<FloatVar>(16)
fun getState() = matrix to 16 * 4
fun rotateBy(vec: Vector2) {
if (!initialized) return
val len = vec.length
if (len < 1e-9f) return
val angle = 180 * len / screen.length
@@ -180,7 +185,7 @@ class Renderer(val arena: NativePlacement, val nativeActivity: ANativeActivity)
val data get() = interpretCPointer<ByteVar>(rawPtr + 54) as CArrayPointer<ByteVar>
}
private fun loadTexture(assetName: String): Unit = with(arena) {
private fun loadTexture(assetName: String): Unit = memScoped {
val asset = AAssetManager_open(nativeActivity.assetManager, assetName, AASSET_MODE_BUFFER)
if (asset == null) {
logError("Error opening asset")
@@ -221,7 +226,7 @@ class Renderer(val arena: NativePlacement, val nativeActivity: ANativeActivity)
private val scale = 1.25f
fun draw() = with (arena) {
fun draw() = memScoped {
if (!initialized) return
glPushMatrix()
@@ -276,6 +281,8 @@ class Renderer(val arena: NativePlacement, val nativeActivity: ANativeActivity)
}
fun destroy() {
if (!initialized) return
logInfo("Destroying context..")
eglMakeCurrent(display, null, null, null)
@@ -287,5 +294,7 @@ class Renderer(val arena: NativePlacement, val nativeActivity: ANativeActivity)
surface = null
context = null
initialized = false
arena.clear()
}
}