crossbow-android 0.2.3

Cross-Platform build tools and toolkit for games
Documentation
package com.crossbow.library

import java.util.HashMap
import java.lang.reflect.Method
import java.lang.StringBuilder
import java.lang.Class

val Any.TAG: String
    get() {
        val tag = javaClass.simpleName
        return if (tag.length <= 23) tag else tag.substring(0, 23)
    }

internal object JNIUtil {
    private val PRIMITIVE_SIGNATURES: MutableMap<Any?, String> = HashMap()

    init {
        PRIMITIVE_SIGNATURES[Boolean::class.javaPrimitiveType] = "Z"
        PRIMITIVE_SIGNATURES[Byte::class.javaPrimitiveType] = "B"
        PRIMITIVE_SIGNATURES[Char::class.javaPrimitiveType] = "C"
        PRIMITIVE_SIGNATURES[Double::class.javaPrimitiveType] = "D"
        PRIMITIVE_SIGNATURES[Float::class.javaPrimitiveType] = "F"
        PRIMITIVE_SIGNATURES[Int::class.javaPrimitiveType] = "I"
        PRIMITIVE_SIGNATURES[Long::class.javaPrimitiveType] = "J"
        PRIMITIVE_SIGNATURES[Short::class.javaPrimitiveType] = "S"
        PRIMITIVE_SIGNATURES[Void.TYPE] = "V"
    }

    /**
     * Build JNI signature for a method
     * @param m
     * @return
     */
    @JvmStatic
    fun getJNIMethodSignature(m: Method): String {
        val sb = StringBuilder("(")
        for (p in m.parameterTypes) {
            sb.append(getJNIClassSignature(p))
        }
        sb.append(')').append(getJNIClassSignature(m.returnType))
        return sb.toString()
    }

    /**
     * Build JNI signature from a class
     * @param c
     * @return
     */
    @JvmStatic
    fun getJNIClassSignature(c: Class<*>): String? {
        return if (c.isArray) {
            val ct = c.componentType
            if (ct === null) {
                return null
            }
            '['.toString() + getJNIClassSignature(ct)
        } else if (c.isPrimitive) {
            PRIMITIVE_SIGNATURES[c]
        } else {
            'L'.toString() + c.name.replace('.', '/') + ';'
        }
    }
}