代码之家  ›  专栏  ›  技术社区  ›  itMaxence

从c库调用objective-c方法

  •  0
  • itMaxence  · 技术社区  · 8 年前

    我在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方法。

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

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

    2 回复  |  直到 8 年前
        1
  •  2
  •   Community Mohan Dere    5 年前

    简而言之:你不能。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也变得生疏了。)

        2
  •  1
  •   greymouser    8 年前

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

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

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

    或者你可以储存 ref

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