我有一个用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方法?
答案 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会进入主题。