从 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
此函数将使用 JNIEnv 和 jobject 来访问 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 进入正题。
我有一个用 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
此函数将使用 JNIEnv 和 jobject 来访问 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 进入正题。