从C库调用objective-c方法

时间:2017-10-26 16:03:30

标签: ios objective-c c cross-platform lib

我有一个用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

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

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

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

2 个答案:

答案 0 :(得分: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也变得生锈了。)

答案 1 :(得分:1)

您绝对可以从C函数中调用Objective-C方法。但是,要这样做,您需要确保C函数具有对某种Objective-C对象的引用。您上面的示例并未显示。

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

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

或许您可以将ref存储在库中的静态存储中,以便所有函数都可以使用它,而不会显式传递它。这真的取决于你的用例。请记住,在Objective-C中,类也是对象;所以如果你需要ref成为一个类(对于静态方法),那也可以。

有一个切线主题。有时,在Objective-C中,您需要直接引用方法实现,以便可以直接调用它。这在需要性能的紧密循环中非常方便。如果这是您的需要,this blog post会进入主题。