从C库调用objective-c方法

问题描述 投票:0回答:2

我有一个用 C (.a) 编写的跨平台库来执行加密操作。

我在 Android 上就是这样使用的

+------------------------+           +-----------------+
|      Android (Java)    |           |  Android (Java) |
+------------------------+           +-----------------+
   1.|              /|\               3.|           /|\
    \|/            4.|                 \|/         2.|
+------------------------------------------------------+
|                    myFramework.a (C)                 |
+------------------------------------------------------+

所以下面的函数是由Java调用的,然后调用Java来处理与之前“上下文”无关的事情

#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 库调用 Objective-C 方法的方法(第 2 部分和第 3 部分。)

如何从 C 库调用 Objective-C 方法?

ios c objective-c cross-platform
2个回答
2
投票

你绝对可以从 C 函数调用 Objective-C 方法。然而,要做到这一点,您需要确保您的 C 函数具有对某种 Objective-C 对象的引用。你上面的例子并没有表明这一点。

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

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

或者您可能会将

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

有一个离题的话题。有时,在 Objective-C 中,您需要直接引用方法实现,以便可以直接调用它。这在需要性能的紧密循环中非常方便。如果这是您的需要,这篇博文将进入主题。


2
投票

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

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

编辑:

实际上,您可能可以使用用 C 编写的 Objective-C 运行时来调用 Objective-C 方法的 C 接口。我已经涉足 Objective-C 运行时,但还不足以流利地了解它。 (另外,我已经在 Swift 中工作了足够长的时间,甚至我的“普通”Objective-C 也变得生疏了。)

© www.soinside.com 2019 - 2024. All rights reserved.