问题标签 [cinterop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
337 浏览

c++ - 如果我最终需要获取 char 指针,我可以安全地使用 string_view 吗?

我正在研究一些最终也需要调用操作系统级 C 代码的 C++ 代码,例如scandir

我想对大部分代码库使用 C++,这(对我而言)意味着我主要使用 std::string 而不是 char 指针。

我有一个接受 string_view 的方法,因此我可以传入 std::string 和 char*,具体取决于 C++ 或“C 互操作”代码是否需要调用它:

注意data()这里的调用,因为 scandir 需要一个const char *. 现在,我看到了这个注释

与 std::basic_string::data() 和字符串字面量不同,data() 可能返回指向非空终止缓冲区的指针。因此,将 data() 传递给仅采用 const CharT* 并期望以空字符结尾的字符串的例程通常是错误的。

这让我想到:有没有更好/更安全的方法?我知道在实践中,调用者将以空字符结尾的字符串,但是当我已经意识到这里存在潜在问题时,我不想在以后创建一个难以诊断的错误。虽然我猜已经不能保证 char* 是空终止的,所以我不会让情况变得更糟。

不过,好奇是否有更好的选择。

  • 我应该检查 string_view 是否有空终止符,如果不存在,创建一个char[directory.size() + 1]{0}并自己复制字符?
  • 或者创建两个重载,一个采用 std::string,另一个采用 const char*?

g++ (GCC) 10.2.1 20201016 (Red Hat 10.2.1-6)通过 CMake 的set(CMAKE_CXX_STANDARD 20).

0 投票
1 回答
160 浏览

c - 如何在 Kotlin/Native 中创建原始数据类型的 CPointer?

分配和获取结构的指针非常简单:

但我正在努力分配或获取IntUIntLongULong其他原始数据类型的指针。

在此处输入图像描述

这些类型都没有任何扩展:

搜索了很多,但似乎没有这方面的文档。

任何帮助是极大的赞赏 :)

0 投票
0 回答
171 浏览

c - Kotlin/Native 如何在工件中包含 C-interop 标头?

我在build.gradle.kts文件中添加了这样的标题:

库编译正常,并发布到 mavenLocal 很好,但是当其他一些项目将其添加为依赖项并运行链接器时,它会产生以下错误:

我们如何在要构建并发布到 maven 的库工件中包含一些 C-interop 标头/符号(目前在 mavenLocal 上进行测试)?

0 投票
0 回答
30 浏览

swift - 用于 Swift 框架的 C API——总是暴露的?

我正在 Swift 5.3 中构建 iOS SDK,并将所有类(文档化的 API 除外)定义为internal(即在我无法使用的地方使用默认访问private)。SDK 作为 cocoapod 动态框架分发。到目前为止,一切都很好。

我的 SDK 有一个C组件;这些函数在内部用于一些计算,预计不会暴露给应用程序开发人员。这些通过 unmbrella 标头暴露给 Swift,我的 Swift 代码可以按预期使用它们。不幸的是,它们也被框架暴露了,导入我的框架的应用程序可以调用这些C函数。它们甚至在代码完成中显示为建议。

我以为我可以在一个单独的文件中声明这些函数并将其声明为一个项目头文件,但是很遗憾,这些函数不能从我的 Swift 类中调用。

最后的手段可能是在将文件头复制到框架时对其进行操作。我错过了什么吗?有没有更好的方法来混淆内部 C 函数?

0 投票
0 回答
406 浏览

kotlin - 如何在 Kotlin Multiplatform Mobile 项目中使用 cinterop

cinterop我想使用该工具将 C 代码集成到 Kotlin Multiplatform Mobile 项目中。我已经花了一些时间在 Kotlin Multiplatform 和 Kotlin/Native 的文档上,但我似乎无法让它工作。

这是我的build.gradle.kts

我想对原生 iOS 部分做同样的事情。

看着 gradle 输出,在我看来 cinterop 配置完全被忽略了。文件是否def存在并不重要。它没有任何区别。

抱歉,如果我错过了这里的明显内容。我对所有不同的 Kotlin 扩展感到有些困惑,尤其是它们应该如何协同工作。

我的配置中缺少什么?甚至可以在 KMM 项目中使用 cinterop。

0 投票
2 回答
91 浏览

r - R 的文档或语言定义是否说明了 R 整数的预期用途?

我看到的关于 R 的整数类型的一个常见评论是,它仅用于与 C 代码进行通信。R 文档的任何官方部分中是否出现过这样的声明?我经常发现自己制作向量integer(10)的印象是它们对我的目的会更有效,只是为了记住这个民间传说并重新考虑我是否应该将整数用于从不尝试与 C 代码通信的代码。

0 投票
1 回答
92 浏览

c - 如何在 Windows/Ubuntu 中安装 cinterop 工具

我正在按照这个教程在 Kotlin(Android Studio)中使用 C 库 https://jonnyzzz.com/blog/2018/05/28/minimalistic-kn/但我找不到如何安装/下载 cinterop 工具在 Windows 和 Ubuntu 中我都有错误“cinterop: command not found”!有人知道如何安装 cinterop 吗?先感谢您

0 投票
0 回答
198 浏览

kotlin-native - Kotlin-Native CompileKotlinIos 任务失败,因为当我更改 Objective-C 代码时 Cinterop 任务无法更新

@Kevin Galligan 我的公司有一个使用 Kotlin-Native 的 iOS 项目,我在 build.gradle.kts 中向项目添加了一个 cinterop:

一切运行良好,ios项目编译成功,但是当我在cinterop中添加一个objective-C函数并在kotlin文件中调用这个函数,然后构建ios项目时,Xcode告诉我kotlin-native模块编译失败。

我知道为什么编译失败,因为当我添加新的 Objective-c 函数时,编译器没有创建相应的 kotlin 函数。

cinterop 任务被跳过,事实上这个任务不应该被跳过,因为 objc 代码改变了。 在此处输入图像描述

但是在我运行命令“gradelw clean”之后,然后在xcode中重建项目,它运行良好,objc函数调用成功。

希望 Kotlin-Native 团队能尽快修复这个 bug,非常感谢!

我的 xcode podspec 文件如下所示: 在此处输入图像描述

我的 cinterop 配置如下所示: 在此处输入图像描述

0 投票
1 回答
205 浏览

kotlin - cinterop 进程以非零退出值 1 结束

我正在这个国际象棋应用程序中试验 kotlin 多平台。我在应用程序中有国际象棋引擎的 c++ 代码。对于每个引擎,我想创建一个 kmm 模块。由于 kotlin native 尚未与 c++ 互操作,因此我必须围绕 c++ 代码创建包装器。在每个 androidMain 中,我都有与 c++ 接口的 JNI 类,这是可行的。ios是我不清楚的地方。我相信我必须围绕 c++ 代码创建一个 obj-c++ 包装器(.mm 文件),然后为包装器执行 cinterop。

这是正确的吗?当我尝试构建它时,gradle sync 失败并出现以下错误:

我已经清理并重新启动了android studio,还尝试了java 8而不是11。

我也很感激有关 def 文件的更多信息的链接。kotlin 文档中没有太多关于它的内容。

我的 jwtc.def:

GameWrapper.h:

GameWrapper.mm:

0 投票
2 回答
72 浏览

kotlin-multiplatform - Kotlin 多平台项目依赖于另一个带有 cocoapods 的项目

我有一个 kotlin multipltform 库,里面有几个 cocoapods

我将此库发布到工件(maven),并且 ios 目标包含用于 cinterop'ed pod 的所有 klib。

我有第二个 Kotlin 多平台库,我希望在其中使用以前的“核心”库。

但是,在链接 ios 时,找不到 pod 模块。

前任:ld: framework not found gRPC_ProtoRPC

我也尝试重新声明 pod 无济于事。

我想要做的甚至可能吗?有没有人有什么建议?

注意:我不是 iOS 开发人员,所以如果我的理解不正确,请严厉批评