我可以从KMM iosMain引用C++代码吗?

edqdpe6u  于 2023-05-08  发布在  iOS
关注(0)|答案(1)|浏览(171)

我正在考虑在我的项目中实现KMM。我可以通过androidMain中的JNI引用C代码。
但是,我无法在iosMain中使用external fun,因为它使用Kotlin/Native。在现有的iOS项目中,可以从Swift调用Objective-C
,并从Objective-C引用C代码。
有办法从iosMain引用C++代码吗?

vawmfj5a

vawmfj5a1#

可以使用Kotlin/Native的互操作性功能从Kotlin代码调用C函数
设置它:
1.在单独的.cpp文件+头文件中编写C
代码,声明要从Kotlin调用的函数
例如:
mymodule.cpp

#include "mymodule.h"

int add(int a, int b) {
    return a + b;
}

mymodule.h

#ifndef MYMODULE_H
#define MYMODULE_H

extern "C" {
    int add(int a, int b);
}

#endif // MYMODULE_H

1.创建新的Xcode项目+头文件(声明你想要使用的C++函数的C接口)
例如:

#ifndef MYMODULE_H
#define MYMODULE_H

int add(int a, int b);

#endif // MYMODULE_H

1.将C++文件添加到Xcode项目中,并作为项目的一部分进行编译
1.在KMM项目中--创建Kotlin/Native模块+添加C头文件
例如:

kotlin {
    iosX64("ios") {
        compilations.main {
            cinterops {
                mymodule {
                    defFile("mymodule.def")
                    includeDirs("src/native/include")
                    compilerOpts("-I$projectDir/src/native/include")
                }
            }
        }
    }
}

1.在Kotlin代码中--使用@CName指定C接口函数的名称
例如:

import kotlinx.cinterop.*

@CName("add")
external fun add(a: Int, b: Int): Int

fun main() {
    val sum = add(1, 2)
    println(sum)
}

相关问题