Kotlin multiplatform/native interoperability with Objective-C framework

Multi tool use
Multi tool use












4















I'm trying to call Swift/Objective-C code from Kotlin in a multiplatform project. There are no problems with calls to platform code. But when I'm trying to call some library (or framework, not sure how it is properly called as I'm not an iOS dev) it fails. Docs states that it is possible to call Objective-C code and Swift if it is properly exported:




Kotlin/Native provides bidirectional interoperability with Objective-C. Objective-C frameworks and libraries can be used in Kotlin code if properly imported to the build (system frameworks are imported by default). See e.g. "Using cinterop" in Gradle plugin documentation. A Swift library can be used in Kotlin code if its API is exported to Objective-C with @objc. Pure Swift modules are not yet supported.




But it does not say anything about how can I import them properly. It only point to gradle plugin description that describes old version of gradle plugin. So it does not work for me. Finally I figured out something might be the way to import Objective-C code:



fromPreset(presets.iosX64, 'ios') {
compilations.main.outputKinds('FRAMEWORK')
compilations.main {
cinterops {
firebase {
def pods = '${System.getProperty("user.home")}/Projects/kmpp/iosApp/Pods/'
includeDirs '${pods}Firebase/CoreOnly/Sources',
'${pods}FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers'
}
}
}
}


Build runs without failures, but it does not import anything. What am I doing wrong? Is it possible to import such a lib at all?



UPD:



here I found an example of usage cinterop tool like this:



cd samples/gitchurn
../../dist/bin/cinterop -def src/main/c_interop/libgit2.def
-compilerOpts -I/usr/local/include -o libgit2


It looks like cinterop tool should be in /dist/bin/ folder in my projects but there is no such folder. Where do I get cinterop tool ?










share|improve this question





























    4















    I'm trying to call Swift/Objective-C code from Kotlin in a multiplatform project. There are no problems with calls to platform code. But when I'm trying to call some library (or framework, not sure how it is properly called as I'm not an iOS dev) it fails. Docs states that it is possible to call Objective-C code and Swift if it is properly exported:




    Kotlin/Native provides bidirectional interoperability with Objective-C. Objective-C frameworks and libraries can be used in Kotlin code if properly imported to the build (system frameworks are imported by default). See e.g. "Using cinterop" in Gradle plugin documentation. A Swift library can be used in Kotlin code if its API is exported to Objective-C with @objc. Pure Swift modules are not yet supported.




    But it does not say anything about how can I import them properly. It only point to gradle plugin description that describes old version of gradle plugin. So it does not work for me. Finally I figured out something might be the way to import Objective-C code:



    fromPreset(presets.iosX64, 'ios') {
    compilations.main.outputKinds('FRAMEWORK')
    compilations.main {
    cinterops {
    firebase {
    def pods = '${System.getProperty("user.home")}/Projects/kmpp/iosApp/Pods/'
    includeDirs '${pods}Firebase/CoreOnly/Sources',
    '${pods}FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers'
    }
    }
    }
    }


    Build runs without failures, but it does not import anything. What am I doing wrong? Is it possible to import such a lib at all?



    UPD:



    here I found an example of usage cinterop tool like this:



    cd samples/gitchurn
    ../../dist/bin/cinterop -def src/main/c_interop/libgit2.def
    -compilerOpts -I/usr/local/include -o libgit2


    It looks like cinterop tool should be in /dist/bin/ folder in my projects but there is no such folder. Where do I get cinterop tool ?










    share|improve this question



























      4












      4








      4


      1






      I'm trying to call Swift/Objective-C code from Kotlin in a multiplatform project. There are no problems with calls to platform code. But when I'm trying to call some library (or framework, not sure how it is properly called as I'm not an iOS dev) it fails. Docs states that it is possible to call Objective-C code and Swift if it is properly exported:




      Kotlin/Native provides bidirectional interoperability with Objective-C. Objective-C frameworks and libraries can be used in Kotlin code if properly imported to the build (system frameworks are imported by default). See e.g. "Using cinterop" in Gradle plugin documentation. A Swift library can be used in Kotlin code if its API is exported to Objective-C with @objc. Pure Swift modules are not yet supported.




      But it does not say anything about how can I import them properly. It only point to gradle plugin description that describes old version of gradle plugin. So it does not work for me. Finally I figured out something might be the way to import Objective-C code:



      fromPreset(presets.iosX64, 'ios') {
      compilations.main.outputKinds('FRAMEWORK')
      compilations.main {
      cinterops {
      firebase {
      def pods = '${System.getProperty("user.home")}/Projects/kmpp/iosApp/Pods/'
      includeDirs '${pods}Firebase/CoreOnly/Sources',
      '${pods}FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers'
      }
      }
      }
      }


      Build runs without failures, but it does not import anything. What am I doing wrong? Is it possible to import such a lib at all?



      UPD:



      here I found an example of usage cinterop tool like this:



      cd samples/gitchurn
      ../../dist/bin/cinterop -def src/main/c_interop/libgit2.def
      -compilerOpts -I/usr/local/include -o libgit2


      It looks like cinterop tool should be in /dist/bin/ folder in my projects but there is no such folder. Where do I get cinterop tool ?










      share|improve this question
















      I'm trying to call Swift/Objective-C code from Kotlin in a multiplatform project. There are no problems with calls to platform code. But when I'm trying to call some library (or framework, not sure how it is properly called as I'm not an iOS dev) it fails. Docs states that it is possible to call Objective-C code and Swift if it is properly exported:




      Kotlin/Native provides bidirectional interoperability with Objective-C. Objective-C frameworks and libraries can be used in Kotlin code if properly imported to the build (system frameworks are imported by default). See e.g. "Using cinterop" in Gradle plugin documentation. A Swift library can be used in Kotlin code if its API is exported to Objective-C with @objc. Pure Swift modules are not yet supported.




      But it does not say anything about how can I import them properly. It only point to gradle plugin description that describes old version of gradle plugin. So it does not work for me. Finally I figured out something might be the way to import Objective-C code:



      fromPreset(presets.iosX64, 'ios') {
      compilations.main.outputKinds('FRAMEWORK')
      compilations.main {
      cinterops {
      firebase {
      def pods = '${System.getProperty("user.home")}/Projects/kmpp/iosApp/Pods/'
      includeDirs '${pods}Firebase/CoreOnly/Sources',
      '${pods}FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers'
      }
      }
      }
      }


      Build runs without failures, but it does not import anything. What am I doing wrong? Is it possible to import such a lib at all?



      UPD:



      here I found an example of usage cinterop tool like this:



      cd samples/gitchurn
      ../../dist/bin/cinterop -def src/main/c_interop/libgit2.def
      -compilerOpts -I/usr/local/include -o libgit2


      It looks like cinterop tool should be in /dist/bin/ folder in my projects but there is no such folder. Where do I get cinterop tool ?







      kotlin kotlin-interop kotlin-native kotlin-multiplatform






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 17 at 14:42









      Mark

      5,37433251




      5,37433251










      asked Jan 2 at 11:24









      oleg.semenoleg.semen

      1,2751537




      1,2751537
























          2 Answers
          2






          active

          oldest

          votes


















          0














          It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?






          share|improve this answer
























          • yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.

            – oleg.semen
            Jan 3 at 15:35













          • I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.

            – Ilya Matveev
            Jan 4 at 6:33



















          0














          I ended up with this cinterops section in build.gradle



              fromPreset(presets.iosX64, 'ios') {
          // This preset is for iPhone emulator
          // Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
          compilations.main {
          outputKinds('FRAMEWORK')
          cinterops {
          firebase {
          defFile "$projectDir/src/iosMain/cinterop/firebase.def"
          includeDirs {
          allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
          "$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
          }

          compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
          linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
          }
          }
          }
          }


          end this .def file:



          language = Objective-C
          headers = FirebaseCore.h FirebaseDatabase.h


          What's going on here ? Cocopods frameworks are placed in Pods directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public folder. and it contains references to other header files it needs... So you specify these files names in your .def file in headers section.



          Next you need to specify where to look for these files and other referenced by them. You can do it in .def file in includeDirs or in build.gradle file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)



          Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts and linkerOpts prefixing them with -F if it is framework or -L if it is library.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54005467%2fkotlin-multiplatform-native-interoperability-with-objective-c-framework%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?






            share|improve this answer
























            • yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.

              – oleg.semen
              Jan 3 at 15:35













            • I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.

              – Ilya Matveev
              Jan 4 at 6:33
















            0














            It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?






            share|improve this answer
























            • yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.

              – oleg.semen
              Jan 3 at 15:35













            • I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.

              – Ilya Matveev
              Jan 4 at 6:33














            0












            0








            0







            It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?






            share|improve this answer













            It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Jan 3 at 5:55









            Ilya MatveevIlya Matveev

            912




            912













            • yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.

              – oleg.semen
              Jan 3 at 15:35













            • I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.

              – Ilya Matveev
              Jan 4 at 6:33



















            • yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.

              – oleg.semen
              Jan 3 at 15:35













            • I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.

              – Ilya Matveev
              Jan 4 at 6:33

















            yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.

            – oleg.semen
            Jan 3 at 15:35







            yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.

            – oleg.semen
            Jan 3 at 15:35















            I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.

            – Ilya Matveev
            Jan 4 at 6:33





            I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.

            – Ilya Matveev
            Jan 4 at 6:33













            0














            I ended up with this cinterops section in build.gradle



                fromPreset(presets.iosX64, 'ios') {
            // This preset is for iPhone emulator
            // Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
            compilations.main {
            outputKinds('FRAMEWORK')
            cinterops {
            firebase {
            defFile "$projectDir/src/iosMain/cinterop/firebase.def"
            includeDirs {
            allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
            "$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
            }

            compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
            linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
            }
            }
            }
            }


            end this .def file:



            language = Objective-C
            headers = FirebaseCore.h FirebaseDatabase.h


            What's going on here ? Cocopods frameworks are placed in Pods directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public folder. and it contains references to other header files it needs... So you specify these files names in your .def file in headers section.



            Next you need to specify where to look for these files and other referenced by them. You can do it in .def file in includeDirs or in build.gradle file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)



            Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts and linkerOpts prefixing them with -F if it is framework or -L if it is library.






            share|improve this answer




























              0














              I ended up with this cinterops section in build.gradle



                  fromPreset(presets.iosX64, 'ios') {
              // This preset is for iPhone emulator
              // Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
              compilations.main {
              outputKinds('FRAMEWORK')
              cinterops {
              firebase {
              defFile "$projectDir/src/iosMain/cinterop/firebase.def"
              includeDirs {
              allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
              "$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
              }

              compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
              linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
              }
              }
              }
              }


              end this .def file:



              language = Objective-C
              headers = FirebaseCore.h FirebaseDatabase.h


              What's going on here ? Cocopods frameworks are placed in Pods directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public folder. and it contains references to other header files it needs... So you specify these files names in your .def file in headers section.



              Next you need to specify where to look for these files and other referenced by them. You can do it in .def file in includeDirs or in build.gradle file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)



              Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts and linkerOpts prefixing them with -F if it is framework or -L if it is library.






              share|improve this answer


























                0












                0








                0







                I ended up with this cinterops section in build.gradle



                    fromPreset(presets.iosX64, 'ios') {
                // This preset is for iPhone emulator
                // Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
                compilations.main {
                outputKinds('FRAMEWORK')
                cinterops {
                firebase {
                defFile "$projectDir/src/iosMain/cinterop/firebase.def"
                includeDirs {
                allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
                "$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
                }

                compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
                linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
                }
                }
                }
                }


                end this .def file:



                language = Objective-C
                headers = FirebaseCore.h FirebaseDatabase.h


                What's going on here ? Cocopods frameworks are placed in Pods directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public folder. and it contains references to other header files it needs... So you specify these files names in your .def file in headers section.



                Next you need to specify where to look for these files and other referenced by them. You can do it in .def file in includeDirs or in build.gradle file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)



                Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts and linkerOpts prefixing them with -F if it is framework or -L if it is library.






                share|improve this answer













                I ended up with this cinterops section in build.gradle



                    fromPreset(presets.iosX64, 'ios') {
                // This preset is for iPhone emulator
                // Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
                compilations.main {
                outputKinds('FRAMEWORK')
                cinterops {
                firebase {
                defFile "$projectDir/src/iosMain/cinterop/firebase.def"
                includeDirs {
                allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
                "$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
                }

                compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
                linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
                }
                }
                }
                }


                end this .def file:



                language = Objective-C
                headers = FirebaseCore.h FirebaseDatabase.h


                What's going on here ? Cocopods frameworks are placed in Pods directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public folder. and it contains references to other header files it needs... So you specify these files names in your .def file in headers section.



                Next you need to specify where to look for these files and other referenced by them. You can do it in .def file in includeDirs or in build.gradle file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)



                Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts and linkerOpts prefixing them with -F if it is framework or -L if it is library.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Jan 18 at 12:31









                oleg.semenoleg.semen

                1,2751537




                1,2751537






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54005467%2fkotlin-multiplatform-native-interoperability-with-objective-c-framework%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Ul,F20B
                    RI4OdsspvSLf4rIe vF7ao8QJcsaJK0kE,6G v0P

                    Popular posts from this blog

                    Monofisismo

                    Angular Downloading a file using contenturl with Basic Authentication

                    Olmecas