从 C 库调用 objective-c 方法

Call objective-c method from C library

我有一个用 C (.a) 编写的跨平台库,用于加密。

我在 Android

上就是这么用的
+------------------------+           +-----------------+
|      Android (Java)    |           |  Android (Java) |
+------------------------+           +-----------------+
   1.|              /|\               3.|           /|\
    \|/            4.|                 \|/         2.|
+------------------------------------------------------+
|                    myFramework.a (C)                 |
+------------------------------------------------------+

所以下面的函数被Java调用了,然后调用Java一些和前面的"context"

不相关的东西
#ifdef __ANDROID__
#include "jni.h"

static JNIEnv *gEnv;
static jobject gObj;

int doStuff(char* aString) { /* have fun calling java */ }

#else

#include "oni.h" // objective c native interface ? :3

#endif

此函数将使用 JNIEnvjobject 来访问 Java 方法。

我已将 C 库包含在 iOS 项目中,但找不到从 C 库(第 2 部分和第 3 部分)调用 objective-c 方法的方法

如何从 C 库中调用 objective-c 方法?

简答:你不能。 C 无法调用 Objective-C 方法。

也就是说,Objective-C 是 C 的纯超集,因此您可以在 Objective-C 代码中编写 C 函数。这些函数需要有一个纯 C 接口,但在内部它们可以包含 Objective-C 代码。所以你需要创建一个 C public 接口(它可以在 C 和 Objective-C 的混合中实现)并从你的 C 库中调用它。

编辑:

实际上,您可以使用用 C 编写的 Objective-C 运行时来调用 C 接口到您的 Objective-C 方法。我已经涉足 Objective-C 运行时,但还不足以流利地了解它。 (此外,我大部分时间都在 Swift 工作了足够长的时间,现在连我的“原版”Objective-C 都生锈了。)

您绝对可以从 C 函数中调用 Objective-C 方法。但是,为此,您需要确保您的 C 函数具有对某种 Objective-C 对象的引用。你上面的例子没有说明这一点。

因此,您可以将函数编写为:

int doStuff(id ref, char* aString) {
  [ref objcMethod];
  ....
  return 0;
}

或者您可以将 ref 存储在库中的静态存储中,以便所有函数都可以使用它,而无需显式传递它。这实际上取决于您的用例。请记住 类 也是 Objective-C 中的对象;因此,如果您需要将 ref 设为 class(对于静态方法),那也可以。

有个题外话。有时,在 Objective-C 中,您希望直接引用方法实现,以便您可以直接调用它。这在需要性能的紧密循环中很方便。如果这是您的需要,this blog post 进入正题。