Skip to content

Commit 0250016

Browse files
committed
Update main to output generated at c26d8e6
1 parent be15331 commit 0250016

2 files changed

Lines changed: 40 additions & 10 deletions

File tree

foundation/kotlin-compiler-learn/kotlin-c-interop/index.html

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,20 @@
10171017
编译器处理 @CCall 函数调用
10181018
</a>
10191019

1020+
</li>
1021+
1022+
<li class="md-nav__item">
1023+
<a href="#_7" class="md-nav__link">
1024+
运行时处理
1025+
</a>
1026+
1027+
</li>
1028+
1029+
<li class="md-nav__item">
1030+
<a href="#_8" class="md-nav__link">
1031+
总结
1032+
</a>
1033+
10201034
</li>
10211035

10221036
</ul>
@@ -2645,6 +2659,20 @@
26452659
编译器处理 @CCall 函数调用
26462660
</a>
26472661

2662+
</li>
2663+
2664+
<li class="md-nav__item">
2665+
<a href="#_7" class="md-nav__link">
2666+
运行时处理
2667+
</a>
2668+
2669+
</li>
2670+
2671+
<li class="md-nav__item">
2672+
<a href="#_8" class="md-nav__link">
2673+
总结
2674+
</a>
2675+
26482676
</li>
26492677

26502678
</ul>
@@ -2666,15 +2694,8 @@
26662694

26672695

26682696
<h1 id="kotlin-c">Kotlin 调用 C 语言是如何实现的?</h1>
2669-
<p>Kotlin 通过 C-interop 实现与 C 语言的互操作性,允许 Kotlin 代码调用 C 函数和使用 C 数据结构。C-interop 是 Kotlin/Native 的一部分,提供了一种机制来生成 Kotlin 代码,以便与 C 库进行交互。</p>
2670-
<p>C-interop 的工作原理是通过解析 C 头文件,生成相应的 Kotlin 代码和 KLIB(Kotlin Library)文件。这个过程包括以下几个步骤:</p>
2671-
<ol>
2672-
<li><strong>接口定义</strong>:使用 <code>.def</code> 文件定义 C 接口,包括头文件、编译选项、链接选项等信息。</li>
2673-
<li><strong>绑定生成</strong>:C-interop 工具解析 <code>.def</code> 文件,生成 Kotlin 代码和 KLIB 文件。这些 KLIB 文件包含了 C 函数的声明和数据结构的定义,使得 Kotlin 可以调用 C 函数。</li>
2674-
<li><strong>数据类型转换</strong>:C-interop 处理基础类型(如整数、浮点数等)和复杂类型(如结构体、枚举等)的映射转换。它会生成相应的 Kotlin 类型,以便在 Kotlin 代码中使用 C 数据结构。</li>
2675-
<li><strong>代码生成</strong>:C-interop 工具生成胶水代码,这些代码在 Kotlin 和 C 之间进行调用和数据传递。它会生成必要的函数调用包装器和属性访问器,以便 Kotlin 可以调用 C 函数。</li>
2676-
<li><strong>运行时支持</strong>:C-interop 提供了运行时支持,包括内存管理和错误处理等。它确保 Kotlin 代码可以正确地与 C 代码交互,并处理跨语言调用中的内存分配和释放。 </li>
2677-
</ol>
2697+
<p>Kotlin/Native 通过 C-interop 机制实现与 C 语言的互操作性,允许 Kotlin 代码直接调用 C 函数和使用 C 数据结构。C-interop 通过解析 C 语言头文件自动生成相应的 Kotlin 绑定代码,为 Kotlin 与 C 库的交互提供了无缝的桥梁。</p>
2698+
<p>我们就一起来看下,Kotlin 调用 C 语言具体是如何实现的。</p>
26782699
<h2 id="_1">接口定义</h2>
26792700
<pre><code>headers = hello.h
26802701

@@ -2846,6 +2867,15 @@ <h2 id="ccall">编译器处理 @CCall 函数调用</h2>
28462867
return result
28472868
}
28482869
</code></pre>
2870+
<h2 id="_7">运行时处理</h2>
2871+
<p>我们知道,Kotlin/Native 使用自动垃圾回收,而 C 语言使用手动内存管理,因此在 Kotlin 调用 C 函数时,可能导致了以下关键问题:</p>
2872+
<ul>
2873+
<li>生命周期不匹配:Kotlin 对象可能被 GC 回收,而 C 代码仍持有引用</li>
2874+
<li>内存泄漏风险:C 代码分配的内存需要手动释放</li>
2875+
<li>数据所有权不明确:谁负责释放内存?</li>
2876+
</ul>
2877+
<p>Kotlin/Native 通过运行时库提供了 C-interop 的支持,处理这些问题。具体原理在介绍 Kotlin/Native 内存管理机制时再介绍。</p>
2878+
<h2 id="_8">总结</h2>
28492879

28502880
<hr>
28512881
<div class="md-source-file">

search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)