{"id":19532043,"url":"https://github.com/jmarkstar/android-swift-jni-kotlin-sample","last_synced_at":"2026-05-06T09:42:22.119Z","repository":{"id":96741722,"uuid":"126087310","full_name":"jmarkstar/Android-Swift-JNI-Kotlin-Sample","owner":"jmarkstar","description":null,"archived":false,"fork":false,"pushed_at":"2018-03-21T20:55:14.000Z","size":56180,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-08T17:06:09.867Z","etag":null,"topics":["android-application","c","jni","kotlin-android","swift4"],"latest_commit_sha":null,"homepage":null,"language":"Makefile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jmarkstar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-03-20T21:53:26.000Z","updated_at":"2018-05-07T19:31:47.000Z","dependencies_parsed_at":"2023-03-18T04:01:15.868Z","dependency_job_id":null,"html_url":"https://github.com/jmarkstar/Android-Swift-JNI-Kotlin-Sample","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmarkstar%2FAndroid-Swift-JNI-Kotlin-Sample","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmarkstar%2FAndroid-Swift-JNI-Kotlin-Sample/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmarkstar%2FAndroid-Swift-JNI-Kotlin-Sample/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmarkstar%2FAndroid-Swift-JNI-Kotlin-Sample/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jmarkstar","download_url":"https://codeload.github.com/jmarkstar/Android-Swift-JNI-Kotlin-Sample/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240784058,"owners_count":19856941,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android-application","c","jni","kotlin-android","swift4"],"created_at":"2024-11-11T01:45:52.171Z","updated_at":"2026-05-06T09:42:22.052Z","avatar_url":"https://github.com/jmarkstar.png","language":"Makefile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sample\n\n### MainActivity\n\n```kotlin\nclass MainActivity : AppCompatActivity() {\n\n    companion object {\n        const val TAG = \"MainActivity\"\n\n        private fun loadNativeDependencies() {\n            System.loadLibrary(\"swiftkotlin\")\n        }\n    }\n\n    private external fun viewLoaded()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        loadNativeDependencies()\n\n\n        var myExampleClass = MyExample()\n\n        var sumDoubles = myExampleClass.sumDoubles(12.5, 12.5)\n\n        myExampleClass.name = \"Marco\"\n\n        Log.v(TAG, \".::Java::.\")\n        Log.v(TAG,\"Sum is \"+sumDoubles.toString())\n        Log.v(TAG, MyExample.concat(\"Hello\", \"World\"))\n        Log.v(TAG, MyExample.MY_INT.toString())\n        Log.v(TAG, \"name \"+myExampleClass.name)\n\n        viewLoaded()\n    }\n}\n```\n\n### Kotlin Class\n\n```java\nclass MyExample {\n\n    companion object {\n        @JvmStatic val MY_BYTE: Byte = 127\n        @JvmStatic val MY_SHORT: Short = 2700\n        @JvmStatic val MY_INT: Int = 1000\n        @JvmStatic val MY_LONG: Long = 12700000\n        @JvmStatic val MY_FLOAT: Float = 1000.4534F\n        @JvmStatic val MY_DOUBLE: Double = 12034343.3434454\n        @JvmStatic val MY_BOOLEAN: Boolean = true\n        @JvmStatic val MY_CHAR: Char = 'S'\n\n        @JvmStatic fun returnInt() : Int = 20\n        @JvmStatic fun sumInts(a: Int, b:Int) : Int = a + b\n        @JvmStatic fun concat(str1: String, str2: String) : String = \"$str1 $str2\"\n    }\n\n    var name: String? = null\n\n    init {\n        println(\"Init Block\")\n    }\n\n    constructor()\n\n    constructor(name: String?){\n        this.name = name\n    }\n\n    fun sumDoubles(d1: Double, d2: Double) : Double = d1 + d2\n\n    fun sayHello(){\n        name = \"Hi $name\"\n    }\n}\n```\n\n### Swift Class\n\n```swift\n\timport Foundation\nimport java_swift\nimport java_lang\nimport java_util\n\nopen class MyExample: JavaObject {\n    \n    public convenience init?( casting object: JavaObject, _ file: StaticString = #file, _ line: Int = #line ) {\n        self.init( javaObject: nil )\n        object.withJavaObject {\n            self.javaObject = $0\n        }\n    }\n    \n    //Global reference of the Java MyExample object\n    private static var MyExampleJNIClass: jclass?\n    \n    //**********************************/\n    //         CONSTRUCTORS             /\n    //**********************************/\n    \n    /** Constructor without params\n     */\n    private static var constructor1: jmethodID?\n    public convenience init() {\n        \n        var __locals = [jobject]()\n        \n        //creating arrays of params for the constructor\n        var params = [jvalue]( repeating: jvalue(), count: 1 )\n\n        //creating newMyExampleObject local ref\n        let newMyExampleObject = JNIMethod\n            .NewObject( className: \"com/jmarkstar/sample/MyExample\",\n                        classCache: \u0026MyExample.MyExampleJNIClass,\n                        methodSig: \"()V\",\n                        methodCache: \u0026MyExample.constructor1, args: \u0026params, locals: \u0026__locals )\n        \n        //creating newMyExampleObject global ref.\n        self.init( javaObject: newMyExampleObject )\n        \n        //deleting newMyExampleObject\n        JNI.DeleteLocalRef( newMyExampleObject )\n    }\n    \n    /** Constructor with name param\n     */\n    private static var constructor2: jmethodID?\n    public convenience init( name: String? ) {\n        \n        var __locals = [jobject]()\n        \n        //creating arrays of params for the constructor\n        var params = [jvalue]( repeating: jvalue(), count: 1 )\n        params[0] = JNIType.toJava( value: name, locals: \u0026__locals )\n        \n        //creating newMyExampleObject local ref\n        let newMyExampleObject = JNIMethod\n            .NewObject( className: \"com/jmarkstar/sample/MyExample\",\n            classCache: \u0026MyExample.MyExampleJNIClass,\n            methodSig: \"(Ljava/lang/String;)V\",\n            methodCache: \u0026MyExample.constructor2, args: \u0026params, locals: \u0026__locals )\n        \n        //creating newMyExampleObject global ref.\n        self.init( javaObject: newMyExampleObject )\n        \n        //deleting newMyExampleObject\n        JNI.DeleteLocalRef( newMyExampleObject )\n    }\n    \n    //**********************************/\n    //        STATIC FIELDS             /\n    //**********************************/\n    \n    private static var MY_BYTE_FieldID: jfieldID?\n    open static var MY_BYTE: Int8 {\n        get{\n            let __value = JNIField\n                .GetStaticByteField(\n                    fieldName: \"MY_BYTE\",\n                    fieldType: \"B\",\n                    fieldCache: \u0026MY_BYTE_FieldID,\n                    className: \"com/jmarkstar/sample/MyExample\", classCache: \u0026MyExample.MyExampleJNIClass )\n            return __value\n        }\n    }\n    \n    private static var MY_SHORT_FieldID: jfieldID?\n    open static var MY_SHORT: Int16 {\n        get{\n            let __value = JNIField\n                .GetStaticShortField(\n                    fieldName: \"MY_SHORT\",\n                    fieldType: \"S\",\n                    fieldCache: \u0026MY_SHORT_FieldID,\n                    className: \"com/jmarkstar/sample/MyExample\", classCache: \u0026MyExample.MyExampleJNIClass )\n            return __value\n        }\n    }\n    \n    private static var MY_INT_FieldID: jfieldID?\n    open static var MY_INT: Int {\n        get{\n            let __value = JNIField\n                .GetStaticIntField(\n                    fieldName: \"MY_INT\",\n                    fieldType: \"I\",\n                    fieldCache: \u0026MY_INT_FieldID,\n                    className: \"com/jmarkstar/sample/MyExample\", classCache: \u0026MyExample.MyExampleJNIClass )\n            return Int(__value)\n        }\n    }\n    \n    private static var MY_LONG_FieldID: jfieldID?\n    open static var MY_LONG: Int64 {\n        get{\n            let __value = JNIField\n                .GetStaticLongField(\n                    fieldName: \"MY_LONG\",\n                    fieldType: \"J\",\n                    fieldCache: \u0026MY_LONG_FieldID,\n                    className: \"com/jmarkstar/sample/MyExample\", classCache: \u0026MyExample.MyExampleJNIClass )\n            return __value\n        }\n    }\n    \n    \n    //**********************************/\n    //        INSTANCE FIELDS           /\n    //**********************************/\n    \n    private static var name_FieldID: jfieldID?\n    open var name: String? {\n        get{\n            let __value = JNIField.GetObjectField(\n                    fieldName: \"name\",\n                    fieldType: \"Ljava/lang/String;\",\n                    fieldCache: \u0026MyExample.name_FieldID,\n                    object: javaObject )\n            defer { JNI.DeleteLocalRef( __value ) }\n            return __value != nil ? String( javaObject: __value ) : nil\n        }\n        set(newName){\n            var __locals = [jobject]()\n            let __value = JNIType.toJava( value: newName, mapClass: \"java/lang/String\", locals: \u0026__locals )\n            \n            JNIField.SetObjectField(\n                fieldName: \"name\",\n                fieldType: \"Ljava/lang/String;\",\n                fieldCache: \u0026MyExample.name_FieldID,\n                object: javaObject,\n                value: __value.l,\n                locals: \u0026__locals )\n        }\n    }\n    \n    //**********************************/\n    //        STATIC METHODS            /\n    //**********************************/\n    \n    private static var returnInt_Method_Ref: jmethodID?\n    open class func returnInt() -\u003e Int {\n        var __locals = [jobject]()\n        var params = [jvalue]( repeating: jvalue(), count: 1 )\n        \n        let returnedInt = JNIMethod.CallStaticIntMethod(\n            className: \"com/jmarkstar/sample/MyExample\",\n            classCache: \u0026MyExample.MyExampleJNIClass,\n            methodName: \"returnInt\",\n            methodSig: \"()I\",\n            methodCache: \u0026returnInt_Method_Ref,\n            args: \u0026params,\n            locals: \u0026__locals )\n        \n        return Int(returnedInt)\n    }\n    \n    private static var sumInts_Method_Ref: jmethodID?\n    open class func sumInts(a: Int, b: Int) -\u003e Int {\n        var __locals = [jobject]()\n        \n        var params = [jvalue]( repeating: jvalue(), count: 2 )\n        params[0] = JNIType.toJava( value: a, locals: \u0026__locals )\n        params[1] = JNIType.toJava( value: b, locals: \u0026__locals )\n        \n        let returnedInt = JNIMethod.CallStaticIntMethod(\n            className: \"com/jmarkstar/sample/MyExample\",\n            classCache: \u0026MyExample.MyExampleJNIClass,\n            methodName: \"sumInts\",\n            methodSig: \"(II)I\",\n            methodCache: \u0026sumInts_Method_Ref,\n            args: \u0026params,\n            locals: \u0026__locals )\n        \n        return Int(returnedInt)\n    }\n    \n    //**********************************/\n    //        INSTANCE METHODS            /\n    //**********************************/\n    \n    private static var sumDoubles_MethodID: jmethodID?\n    open func sumDoubles(d1: Double, d2: Double) -\u003e Double {\n        \n        var __locals = [jobject]()\n        \n        var params = [jvalue]( repeating: jvalue(), count: 2 )\n        params[0] = JNIType.toJava( value: d1, locals: \u0026__locals )\n        params[1] = JNIType.toJava( value: d2, locals: \u0026__locals )\n        \n        let __return = JNIMethod.CallDoubleMethod(\n            object: javaObject,\n            methodName: \"sumDoubles\",\n            methodSig: \"(DD)D\",\n            methodCache: \u0026MyExample.sumDoubles_MethodID,\n            args: \u0026params,\n            locals: \u0026__locals )\n        \n        return __return\n    }\n    \n    private static var sayHello_MethodID: jmethodID?\n    open func sayHello(){\n        var __locals = [jobject]()\n        var params = [jvalue]( repeating: jvalue(), count: 1 )\n        JNIMethod.CallVoidMethod(\n            object: javaObject,\n            methodName: \"sayHello\",\n            methodSig: \"()V\",\n            methodCache: \u0026MyExample.sayHello_MethodID,\n            args: \u0026params,\n            locals: \u0026__locals )\n    }\n}\n```\n\n### Using Swift class to call Kotlin class\n\n```swift \nimport Foundation\nimport java_lang\nimport java_util\nimport Foundation\n\nopen class main {\n    \n    public init() {\n        NSLog(\"\\(type(of: self)): \\(#function)\")\n    }\n    \n\n    // one-off call to bind the Java and Swift sections of app\n    @_silgen_name(\"Java_com_jmarkstar_sample_MainActivity_viewLoaded\")\n    public static func viewLoaded( __env: UnsafeMutablePointer\u003cJNIEnv?\u003e, __this: jobject?){\n        \n        NSLog(\"\\(type(of: self)): \\(#function)\")\n        \n        NSLog(\".::SWIFT::.\")\n        \n        let myExample = MyExample(name: \"Marco\")\n        \n        NSLog(\"NAME instance field: \\(myExample.name!)\")\n        myExample.name = \"Shelly\"\n        NSLog(\"NAME instance field: \\(myExample.name!)\")\n        \n        let result: Double = myExample.sumDoubles(d1: 25.342323, d2: 34.232356)\n        NSLog(\"result sumDoubles: \\(result)\")\n        \n        myExample.sayHello()\n        \n        NSLog(\"NAME instance field: \\(myExample.name!)\")\n        \n        NSLog(\"returned int: \\(MyExample.returnInt())\")\n        \n        NSLog(\"retured sumInts: \\(MyExample.sumInts(a: 30, b: 30))\")\n        \n        NSLog(\"MY BYTE static field: \\(MyExample.MY_BYTE)\")\n        NSLog(\"MY SHORT static field: \\(MyExample.MY_SHORT)\")\n        NSLog(\"MY INT static field: \\(MyExample.MY_INT)\")\n        NSLog(\"MY LONG static field: \\(MyExample.MY_LONG)\")\n        \n        \n    }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmarkstar%2Fandroid-swift-jni-kotlin-sample","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjmarkstar%2Fandroid-swift-jni-kotlin-sample","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmarkstar%2Fandroid-swift-jni-kotlin-sample/lists"}