8

Okay, I've read half a dozen threads on this subject, but none of the solutions appear to address exact needs.

Question:

How does a Pure C (.c) function call a method inside a Pure Objective-C (.m) class?

Every example / answer is using C inside an Objective-C (.m) method. I have a Pure C library that I have to create a simulator for, so I need to keep my Kernel in pure C and call out to my higher level emulation methods in Objective-C.

Any attempt I make to create a reference and call a method fails. Square bracket notation fails as well. Creating a global var in Obj-C and trying to use that in Pure-C doesn't work, as if the namespace is segregated.

Anyone done this?

Here's a diagram of the flow:

Obj-C UIButton CLICKED->Calls Obj-C method->Calls C function->Call Obj-C method

7
  • 4
    c doesn't have class!!! Commented Dec 6, 2013 at 8:10
  • Sorry, typo. As in the title, I meant function. Thanks for the sighting the technicality. Commented Dec 6, 2013 at 8:12
  • Hi You can very well achieve your goal but you will have to have a merging point. You cant keep both separate and still work with both of them. create your test.c file import your test.c file in the required converge.m file you will have all the methods use this converge.m file to get result from c file and change it for consumption of objective-c. example Commented Dec 6, 2013 at 8:27
  • Example for C++ is here (can be use with plain C, too): stackoverflow.com/questions/1061005/…) Commented Dec 6, 2013 at 8:29
  • use function pointer and mix of c and objectivec method in wrapper class Commented Dec 6, 2013 at 8:35

3 Answers 3

3

After much experimenting, I found that the most elegant way of solving my problem was to turn my core C library into an NSObject using the .m suffix. The method of calling back and forth resolved instantly. This change DOES alter my original library, but by so little, it's manageable. So to review:

My original C file was renamed to use the .m suffix. Then I added

@interface myCLibrary : NSObject @end 

to my .h file, and added to my formerly .c file, now renamed .m.

@implementation myCLibrary @end 

Just remember that C functions aren't to be pasted between these interface / implementation declarations, below them. Only Objective-C is to go inside these statements. Once I did that, calling the C functions, and calling BACK to other C functions worked great.

Thanks for all the help regardless.

Sign up to request clarification or add additional context in comments.

Comments

1

Objective C can compile c method without any modification. To call c method from objective-c class you have to whatever you do in c, just include the header file then call method directly. Suppose you have a C header named test.h and in that you have a method sum(int i, int j); then first include test.h and then call test(1, 2);

If you want to call C++ method, use Objective-C++ (.mm extension) in the same manner as explained above.

7 Comments

One correction: Only C, not C++. Objective-C++ can call C++ method.
You know I tried this, and I get an error of "implicit declaration of function "test" is invalid in C99. I'm using GNU99 though. I guess C99 is used for the C side of the linking?
to avoid error on C99 you can follow this: stackoverflow.com/questions/15850042/…
The challenge with those solutions is that the test method IS declared in the imported view controller, so declaring it again would probably throw the compiler off in thinking that it belongs to somewhere else.
you can create a .h file then you can declare your c method on the file. then you can include the .h file, I think this will solve your problem.
|
0

I hope i understand you correctly!

You can do this via callback-function.

In you C file use this:

Define the callback-type

eventcallback g_callback; 

Implement callback-class (executed by objective-c code)

void comm_set_callback(eventcallback callback){ g_callback = callback; } 

in objective-c:

Set the callback (i.e.: in viewDidLoad())

comm_set_callback(&testfkt); 

C-Method called from extern C-function

void testfkt(){ [refToSelf testmethod]; } 

Objective-C Method called from C-Method testfkt

-(void)testmethod{ ... } 

17 Comments

I like where you're going, but where does "eventcallback" type come from? I'm getting an error.
@MarkLöwe Don't substitute mechanically. Those are metasyntactic types. You'll have to change them to actual types defined by you.
I guess I'm asking, is that a function reference?
use this in your .h file typedef void (*eventcallback)(void);
Did you mean "&testmethod" in this line? comm_set_callback(&testfkt);
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.