Fixed samples for 0.9 (#2002)
This commit is contained in:
@@ -22,11 +22,11 @@ import platform.gles3.*
|
|||||||
import platform.linux.*
|
import platform.linux.*
|
||||||
|
|
||||||
fun logError(message: String) {
|
fun logError(message: String) {
|
||||||
__android_log_write(ANDROID_LOG_ERROR, "KonanActivity", message)
|
__android_log_write(ANDROID_LOG_ERROR.convert(), "KonanActivity", message)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun logInfo(message: String) {
|
fun logInfo(message: String) {
|
||||||
__android_log_write(ANDROID_LOG_INFO, "KonanActivity", message)
|
__android_log_write(ANDROID_LOG_INFO.convert(), "KonanActivity", message)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getUnixError() = strerror(posix_errno())!!.toKString()
|
private fun getUnixError() = strerror(posix_errno())!!.toKString()
|
||||||
@@ -35,7 +35,7 @@ const val LOOPER_ID_INPUT = 2
|
|||||||
|
|
||||||
inline fun <reified T : CPointed> CPointer<*>?.dereferenceAs(): T = this!!.reinterpret<T>().pointed
|
inline fun <reified T : CPointed> CPointer<*>?.dereferenceAs(): T = this!!.reinterpret<T>().pointed
|
||||||
|
|
||||||
class Engine(val state: NativeActivityState): DisposableContainer() {
|
class Engine(val state: NativeActivityState) : DisposableContainer() {
|
||||||
private val renderer = Renderer(this, state.activity!!.pointed, state.savedState)
|
private val renderer = Renderer(this, state.activity!!.pointed, state.savedState)
|
||||||
private var queue: CPointer<AInputQueue>? = null
|
private var queue: CPointer<AInputQueue>? = null
|
||||||
private var rendererState: COpaquePointer? = null
|
private var rendererState: COpaquePointer? = null
|
||||||
@@ -94,22 +94,22 @@ class Engine(val state: NativeActivityState): DisposableContainer() {
|
|||||||
private val jniBrigde = JniBridge(state.activity!!.pointed.vm!!)
|
private val jniBrigde = JniBridge(state.activity!!.pointed.vm!!)
|
||||||
|
|
||||||
private fun callToManagedAPI() = jniBrigde.withLocalFrame {
|
private fun callToManagedAPI() = jniBrigde.withLocalFrame {
|
||||||
// Actually, this is a context pointer.
|
// Actually, this is a context pointer.
|
||||||
val context = JniObject(state.activity!!.pointed.clazz!!)
|
val context = JniObject(state.activity!!.pointed.clazz!!)
|
||||||
|
|
||||||
val contextClass = FindClass("android/content/Context")
|
val contextClass = FindClass("android/content/Context")
|
||||||
val getSystemServiceMethod = GetMethodID(
|
val getSystemServiceMethod = GetMethodID(
|
||||||
contextClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;")!!
|
contextClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;")!!
|
||||||
val vibrator = CallObjectMethod(context, getSystemServiceMethod, "vibrator")
|
val vibrator = CallObjectMethod(context, getSystemServiceMethod, "vibrator")
|
||||||
if (vibrator != null) {
|
if (vibrator != null) {
|
||||||
val vibratorClass = FindClass("android/os/Vibrator")
|
val vibratorClass = FindClass("android/os/Vibrator")
|
||||||
val vibrateMethod = GetMethodID(vibratorClass, "vibrate", "(J)V")!!
|
val vibrateMethod = GetMethodID(vibratorClass, "vibrate", "(J)V")!!
|
||||||
CallVoidMethod(vibrator, vibrateMethod, 500L)
|
CallVoidMethod(vibrator, vibrateMethod, 500L)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun processSysEvent(fd: IntVar): Boolean {
|
private fun processSysEvent(fd: IntVar): Boolean {
|
||||||
val readBytes = read(fd.value, eventPointer.ptr, pointerSize.narrow()).toLong()
|
val readBytes = read(fd.value, eventPointer.ptr, pointerSize.convert()).toLong()
|
||||||
if (readBytes != pointerSize.toLong()) {
|
if (readBytes != pointerSize.toLong()) {
|
||||||
logError("Failure reading event, $readBytes read: ${getUnixError()}")
|
logError("Failure reading event, $readBytes read: ${getUnixError()}")
|
||||||
return true
|
return true
|
||||||
@@ -163,12 +163,12 @@ class Engine(val state: NativeActivityState): DisposableContainer() {
|
|||||||
NativeActivityEventKind.SAVE_INSTANCE_STATE -> {
|
NativeActivityEventKind.SAVE_INSTANCE_STATE -> {
|
||||||
val saveStateEvent = eventPointer.value.dereferenceAs<NativeActivitySaveStateEvent>()
|
val saveStateEvent = eventPointer.value.dereferenceAs<NativeActivitySaveStateEvent>()
|
||||||
val state = renderer.getState()
|
val state = renderer.getState()
|
||||||
val dataSize = state.second.signExtend<size_t>()
|
val dataSize = state.second
|
||||||
rendererState = realloc(rendererState, dataSize)
|
rendererState = realloc(rendererState, dataSize.convert())
|
||||||
memcpy(rendererState, state.first, dataSize)
|
memcpy(rendererState, state.first, dataSize.convert())
|
||||||
logInfo("Saving instance state to $rendererState: $dataSize bytes")
|
logInfo("Saving instance state to $rendererState: $dataSize bytes")
|
||||||
saveStateEvent.savedState = rendererState
|
saveStateEvent.savedState = rendererState
|
||||||
saveStateEvent.savedStateSize = dataSize
|
saveStateEvent.savedStateSize = dataSize.convert()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@@ -183,7 +183,7 @@ class Engine(val state: NativeActivityState): DisposableContainer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getEventPoint(event: CPointer<AInputEvent>?, i: Int) =
|
private fun getEventPoint(event: CPointer<AInputEvent>?, i: Int) =
|
||||||
Vector2(AMotionEvent_getRawX(event, i.signExtend<size_t>()), AMotionEvent_getRawY(event, i.signExtend<size_t>()))
|
Vector2(AMotionEvent_getRawX(event, i.convert()), AMotionEvent_getRawY(event, i.convert()))
|
||||||
|
|
||||||
private fun getEventTime(event: CPointer<AInputEvent>?) =
|
private fun getEventTime(event: CPointer<AInputEvent>?) =
|
||||||
AMotionEvent_getEventTime(event) / 1_000_000_000.0f
|
AMotionEvent_getEventTime(event) / 1_000_000_000.0f
|
||||||
@@ -195,8 +195,8 @@ class Engine(val state: NativeActivityState): DisposableContainer() {
|
|||||||
}
|
}
|
||||||
val event = inputEvent.value
|
val event = inputEvent.value
|
||||||
val eventType = AInputEvent_getType(event)
|
val eventType = AInputEvent_getType(event)
|
||||||
if (eventType == AINPUT_EVENT_TYPE_MOTION) {
|
if (eventType.toUInt() == AINPUT_EVENT_TYPE_MOTION) {
|
||||||
val action = AKeyEvent_getAction(event) and AMOTION_EVENT_ACTION_MASK
|
val action = AKeyEvent_getAction(event).toUInt() and AMOTION_EVENT_ACTION_MASK
|
||||||
when (action) {
|
when (action) {
|
||||||
AMOTION_EVENT_ACTION_DOWN -> {
|
AMOTION_EVENT_ACTION_DOWN -> {
|
||||||
animating = false
|
animating = false
|
||||||
|
|||||||
@@ -24,8 +24,10 @@ data class JniMethod(val jmethod: jmethodID)
|
|||||||
|
|
||||||
fun asJniClass(jclass: jclass?) =
|
fun asJniClass(jclass: jclass?) =
|
||||||
if (jclass != null) JniClass(jclass) else null
|
if (jclass != null) JniClass(jclass) else null
|
||||||
|
|
||||||
fun asJniObject(jobject: jobject?) =
|
fun asJniObject(jobject: jobject?) =
|
||||||
if (jobject != null) JniObject(jobject) else null
|
if (jobject != null) JniObject(jobject) else null
|
||||||
|
|
||||||
fun asJniMethod(jmethodID: jmethodID?) =
|
fun asJniMethod(jmethodID: jmethodID?) =
|
||||||
if (jmethodID != null) JniMethod(jmethodID) else null
|
if (jmethodID != null) JniMethod(jmethodID) else null
|
||||||
|
|
||||||
@@ -52,7 +54,7 @@ class JniBridge(val vm: CPointer<JavaVMVar>) {
|
|||||||
val fPopLocalFrame = envFunctions.PopLocalFrame!!
|
val fPopLocalFrame = envFunctions.PopLocalFrame!!
|
||||||
|
|
||||||
private fun check() {
|
private fun check() {
|
||||||
if (fExceptionCheck(jniEnv) != 0.toByte()) {
|
if (fExceptionCheck(jniEnv) != 0.toUByte()) {
|
||||||
fExceptionDescribe(jniEnv)
|
fExceptionDescribe(jniEnv)
|
||||||
fExceptionClear(jniEnv)
|
fExceptionClear(jniEnv)
|
||||||
throw Error("JVM exception thrown")
|
throw Error("JVM exception thrown")
|
||||||
@@ -89,7 +91,7 @@ class JniBridge(val vm: CPointer<JavaVMVar>) {
|
|||||||
fun GetMethodID(clazz: JniClass?, name: String, signature: String) = memScoped {
|
fun GetMethodID(clazz: JniClass?, name: String, signature: String) = memScoped {
|
||||||
val result = asJniMethod(fGetMethodID(jniEnv, clazz?.jclass, name.cstr.ptr, signature.cstr.ptr))
|
val result = asJniMethod(fGetMethodID(jniEnv, clazz?.jclass, name.cstr.ptr, signature.cstr.ptr))
|
||||||
check()
|
check()
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
fun CallVoidMethod(receiver: JniObject?, method: JniMethod, vararg arguments: Any?) = memScoped {
|
fun CallVoidMethod(receiver: JniObject?, method: JniMethod, vararg arguments: Any?) = memScoped {
|
||||||
|
|||||||
@@ -73,21 +73,21 @@ class Renderer(val container: DisposableContainer,
|
|||||||
if (savedMatrix != null) {
|
if (savedMatrix != null) {
|
||||||
memcpy(matrix, savedMatrix, 16 * 4)
|
memcpy(matrix, savedMatrix, 16 * 4)
|
||||||
} else {
|
} else {
|
||||||
for (i in 0 .. 3)
|
for (i in 0..3)
|
||||||
for (j in 0 .. 3)
|
for (j in 0..3)
|
||||||
matrix[i * 4 + j] = if (i == j) 1.0f else 0.0f
|
matrix[i * 4 + j] = if (i == j) 1.0f else 0.0f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun initialize(window: CPointer<ANativeWindow>): Boolean {
|
fun initialize(window: CPointer<ANativeWindow>): Boolean {
|
||||||
with (container.arena) {
|
with(container.arena) {
|
||||||
logInfo("Initializing context..")
|
logInfo("Initializing context..")
|
||||||
display = eglGetDisplay(null)
|
display = eglGetDisplay(null)
|
||||||
if (display == null) {
|
if (display == null) {
|
||||||
logError("eglGetDisplay() returned error ${eglGetError()}")
|
logError("eglGetDisplay() returned error ${eglGetError()}")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if (eglInitialize(display, null, null) == 0) {
|
if (eglInitialize(display, null, null) == 0u) {
|
||||||
logError("eglInitialize() returned error ${eglGetError()}")
|
logError("eglInitialize() returned error ${eglGetError()}")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -100,11 +100,11 @@ class Renderer(val container: DisposableContainer,
|
|||||||
EGL_NONE
|
EGL_NONE
|
||||||
)
|
)
|
||||||
val numConfigs = alloc<EGLintVar>()
|
val numConfigs = alloc<EGLintVar>()
|
||||||
if (eglChooseConfig(display, attribs, null, 0, numConfigs.ptr) == 0) {
|
if (eglChooseConfig(display, attribs, null, 0, numConfigs.ptr) == 0u) {
|
||||||
throw Error("eglChooseConfig()#1 returned error ${eglGetError()}")
|
throw Error("eglChooseConfig()#1 returned error ${eglGetError()}")
|
||||||
}
|
}
|
||||||
val supportedConfigs = allocArray<EGLConfigVar>(numConfigs.value)
|
val supportedConfigs = allocArray<EGLConfigVar>(numConfigs.value)
|
||||||
if (eglChooseConfig(display, attribs, supportedConfigs, numConfigs.value, numConfigs.ptr) == 0) {
|
if (eglChooseConfig(display, attribs, supportedConfigs, numConfigs.value, numConfigs.ptr) == 0u) {
|
||||||
throw Error("eglChooseConfig()#2 returned error ${eglGetError()}")
|
throw Error("eglChooseConfig()#2 returned error ${eglGetError()}")
|
||||||
}
|
}
|
||||||
var configIndex = 0
|
var configIndex = 0
|
||||||
@@ -113,11 +113,11 @@ class Renderer(val container: DisposableContainer,
|
|||||||
val g = alloc<EGLintVar>()
|
val g = alloc<EGLintVar>()
|
||||||
val b = alloc<EGLintVar>()
|
val b = alloc<EGLintVar>()
|
||||||
val d = alloc<EGLintVar>()
|
val d = alloc<EGLintVar>()
|
||||||
if (eglGetConfigAttrib(display, supportedConfigs[configIndex], EGL_RED_SIZE, r.ptr) != 0 &&
|
if (eglGetConfigAttrib(display, supportedConfigs[configIndex], EGL_RED_SIZE, r.ptr) != 0u &&
|
||||||
eglGetConfigAttrib(display, supportedConfigs[configIndex], EGL_GREEN_SIZE, g.ptr) != 0 &&
|
eglGetConfigAttrib (display, supportedConfigs[configIndex], EGL_GREEN_SIZE, g.ptr) != 0u &&
|
||||||
eglGetConfigAttrib(display, supportedConfigs[configIndex], EGL_BLUE_SIZE, b.ptr) != 0 &&
|
eglGetConfigAttrib(display, supportedConfigs[configIndex], EGL_BLUE_SIZE, b.ptr) != 0u &&
|
||||||
eglGetConfigAttrib(display, supportedConfigs[configIndex], EGL_DEPTH_SIZE, d.ptr) != 0 &&
|
eglGetConfigAttrib(display, supportedConfigs[configIndex], EGL_DEPTH_SIZE, d.ptr) != 0u &&
|
||||||
r.value == 8 && g.value == 8 && b.value == 8 && d.value == 0) break
|
r.value == 8 && g.value == 8 && b.value == 8 && d.value == 0) break
|
||||||
++configIndex
|
++configIndex
|
||||||
}
|
}
|
||||||
if (configIndex >= numConfigs.value)
|
if (configIndex >= numConfigs.value)
|
||||||
@@ -133,16 +133,16 @@ class Renderer(val container: DisposableContainer,
|
|||||||
throw Error("eglCreateContext() returned error ${eglGetError()}")
|
throw Error("eglCreateContext() returned error ${eglGetError()}")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eglMakeCurrent(display, surface, surface, context) == 0) {
|
if (eglMakeCurrent(display, surface, surface, context) == 0u) {
|
||||||
throw Error("eglMakeCurrent() returned error ${eglGetError()}")
|
throw Error("eglMakeCurrent() returned error ${eglGetError()}")
|
||||||
}
|
}
|
||||||
|
|
||||||
val width = alloc<EGLintVar>()
|
val width = alloc<EGLintVar>()
|
||||||
val height = alloc<EGLintVar>()
|
val height = alloc<EGLintVar>()
|
||||||
if (eglQuerySurface(display, surface, EGL_WIDTH, width.ptr) == 0
|
if (eglQuerySurface(display, surface, EGL_WIDTH, width.ptr) == 0u
|
||||||
|| eglQuerySurface(display, surface, EGL_HEIGHT, height.ptr) == 0) {
|
|| eglQuerySurface (display, surface, EGL_HEIGHT, height.ptr) == 0u) {
|
||||||
throw Error("eglQuerySurface() returned error ${eglGetError()}")
|
throw Error("eglQuerySurface() returned error ${eglGetError()}")
|
||||||
}
|
}
|
||||||
|
|
||||||
this@Renderer.screen = Vector2(width.value.toFloat(), height.value.toFloat())
|
this@Renderer.screen = Vector2(width.value.toFloat(), height.value.toFloat())
|
||||||
|
|
||||||
@@ -198,14 +198,13 @@ class Renderer(val container: DisposableContainer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun loadTexture(assetName: String): Unit = memScoped {
|
private fun loadTexture(assetName: String): Unit = memScoped {
|
||||||
val asset = AAssetManager_open(nativeActivity.assetManager, assetName, AASSET_MODE_BUFFER)
|
val asset = AAssetManager_open(nativeActivity.assetManager, assetName, AASSET_MODE_BUFFER.convert())
|
||||||
?: throw Error("Error opening asset $assetName")
|
?: throw Error("Error opening asset $assetName")
|
||||||
try {
|
try {
|
||||||
val length = AAsset_getLength(asset)
|
val length = AAsset_getLength(asset)
|
||||||
val buffer = allocArray<ByteVar>(length)
|
val buffer = allocArray<ByteVar>(length)
|
||||||
if (AAsset_read(asset, buffer, length) != length.toInt()) {
|
if (AAsset_read(asset, buffer, length.convert()) != length.toInt()) {
|
||||||
throw Error("Error reading asset")
|
throw Error("Error reading asset")
|
||||||
}
|
}
|
||||||
with(BMPHeader(buffer.rawValue)) {
|
with(BMPHeader(buffer.rawValue)) {
|
||||||
@@ -247,7 +246,7 @@ class Renderer(val container: DisposableContainer,
|
|||||||
|
|
||||||
glMultMatrixf(matrix)
|
glMultMatrixf(matrix)
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
|
glClear((GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT).toUInt())
|
||||||
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY)
|
glEnableClientState(GL_VERTEX_ARRAY)
|
||||||
glEnableClientState(GL_NORMAL_ARRAY)
|
glEnableClientState(GL_NORMAL_ARRAY)
|
||||||
@@ -289,15 +288,15 @@ class Renderer(val container: DisposableContainer,
|
|||||||
|
|
||||||
glPopMatrix()
|
glPopMatrix()
|
||||||
|
|
||||||
if (eglSwapBuffers(display, surface) == 0) {
|
if (eglSwapBuffers(display, surface) == 0u) {
|
||||||
val error = eglGetError()
|
val error = eglGetError()
|
||||||
if (error != EGL_BAD_SURFACE)
|
if (error != EGL_BAD_SURFACE)
|
||||||
throw Error("eglSwapBuffers() returned error $error")
|
throw Error("eglSwapBuffers() returned error $error")
|
||||||
else {
|
else {
|
||||||
if (eglMakeCurrent(display, surface, surface, context) == 0) {
|
if (eglMakeCurrent(display, surface, surface, context) == 0u) {
|
||||||
throw Error("Reinit eglMakeCurrent() returned error ${eglGetError()}")
|
throw Error("Reinit eglMakeCurrent() returned error ${eglGetError()}")
|
||||||
}
|
}
|
||||||
if (eglSwapBuffers(display, surface) == 0)
|
if (eglSwapBuffers(display, surface) == 0u)
|
||||||
throw Error("Bad eglSwapBuffers() after surface reinit: ${eglGetError()}")
|
throw Error("Bad eglSwapBuffers() after surface reinit: ${eglGetError()}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -306,7 +305,7 @@ class Renderer(val container: DisposableContainer,
|
|||||||
fun start() {
|
fun start() {
|
||||||
logInfo("Starting renderer..")
|
logInfo("Starting renderer..")
|
||||||
if (initialized) {
|
if (initialized) {
|
||||||
if (eglMakeCurrent(display, surface, surface, context) == 0) {
|
if (eglMakeCurrent(display, surface, surface, context) == 0u) {
|
||||||
throw Error("eglMakeCurrent() returned error ${eglGetError()}")
|
throw Error("eglMakeCurrent() returned error ${eglGetError()}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,5 +6,5 @@ source "$DIR/../konan.sh"
|
|||||||
|
|
||||||
PYTHON=python
|
PYTHON=python
|
||||||
|
|
||||||
konanc -p dynamic src/main/kotlin/Server.kt -o server
|
konanc -p dynamic ${DIR}/src/main/kotlin/Server.kt -o server
|
||||||
sudo $PYTHON src/main/python/setup.py install
|
sudo $PYTHON ${DIR}/src/main/python/setup.py install
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ object MNIST {
|
|||||||
|
|
||||||
val file = fopen(path, "rb") ?: fail()
|
val file = fopen(path, "rb") ?: fail()
|
||||||
try {
|
try {
|
||||||
ByteArray(size).also { fread(it.refTo(0), 1, size.signExtend(), file) }
|
ByteArray(size).also { fread(it.refTo(0), 1, size.convert(), file) }
|
||||||
} finally {
|
} finally {
|
||||||
fclose(file)
|
fclose(file)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user