一:OC调用C语言

C语言的.h文件

    //
// TestPrint.h
// TestDemo
//
// Created by Techsun on 14-8-12.
// Copyright (c) 2014年 techsun. All rights reserved.
// #ifndef TestDemo_TestPrint_h
#define TestDemo_TestPrint_h void printlog(); #endif

C语言中.c文件

    //
// TestPrint.c
// TestDemo
//
// Created by Techsun on 14-8-12.
// Copyright (c) 2014年 techsun. All rights reserved.
// #include <stdio.h>
#include "TestPrint.h" void printlog(){
printf("hello world !!!");
}

OC的.m文件

//
// AClass.m
// TestDemo
//
// Created by Techsun on 14-8-12.
// Copyright (c) 2014年 techsun. All rights reserved.
// #import "AClass.h"
#import "TestPrint.h" @implementation AClass
- (void)printfhello{
printlog();
}
@end

二:C语言调用OC

1)方式1:c++直接包含oc头文件,编译时加入连接选项

  main.cpp

#include "CppFile.h"
#include <memory> int main(int argc, char** argv)
{
std::shared_ptr<CppFile> cppfile(new CppFile());
cppfile->print_cpp_Msg();
cppfile->print_oc_Msg(); return 0;
}

CppFile.h

#ifndef __CPP_FILE__
#define __CPP_FILE__ class CppFile
{
public:
void print_cpp_Msg();
void print_oc_Msg();
};
#endif

CppFile.mm 因为CppFile中使用OC相关的函数,所以我们需要import

#include <iostream>
#import <Foundation/Foundation.h> #include "CppFile.h" void CppFile::print_cpp_Msg()
{
std::cout << "This is cpp file msg" << std::endl;
} void CppFile::print_oc_Msg()
{
NSLog(@"This is object-c msg");
}

编译及运行

在编译的时候需要加上-framework Foundation的参数,否则会提示找不到”_NSLog”定义。

Compile:

#compile cpp file
clang++ -g -O2 -Wall -std=c++11 -c main.cpp
#compile oc file
clang++ -g -O2 -Wall -std=c++11 -c CppFile.mm -framework Foundation
#link object
clang++ -o test main.o CppFile.o -framework Foundation 2)OC实现回调函数,并传递给C

1、参数传递

1.1 全局:自定义一种CallBackFunc类型的函数指针   
typedef void (*CallBackFunc)(param);

1.2 在类 A(OC)中

定义回调函数的实现:

void playCallback(param)
{
    //NSLog(@"loginCallback");
}

同时,调用类B的函数,同时把playCallback作为参数传递过去

void B::setCallBack(playCallback);

1.3 在类B(C++)中定义类型为CallBackFunc的函数指针:
CallBackFunc pCallBackFunc;

void B::setCallBack(CallBackFunc pcallbackFunc)

{

this->pCallBackFunc = pcallbackFunc;

}

 

oc与c语言的相互调用的更多相关文章

  1. iOS JS 和 OC交互 / JS 和 native 相互调用

    现在app 上越来越多需求是通过UIWebView 来展示html 或者 html5的内容, js 和 native OC代码交互 就非常常见了. js 调用 native  OC代码 第一种机制 ( ...

  2. C&C++——C函数与C++函数相互调用问题

    C C++相互调用 在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题,但只要我的C代码和我的C++代码分别都能成功编译,那其他就不是问题.近来在主程序是C语 ...

  3. Lua 与 OC 相互调用

    本文主要讲如何完成lua和object-c的相互调用.       lua是一种脚本语言,可以方便的移植到各种宿主语言中,并且可以支持热更新,在游戏开发中也能当做主要的语言来编写游戏的逻辑,但是要接入 ...

  4. JS代码和OC代码的相互调用

    JS调用OC 很多应用里面或多或少的调用了网页,来达到绚丽的效果,所谓的JS调用OC.....举个例子吧,网页上有个按钮 点击按钮跳转界面,跳转的动作由OC的代码实现. OC调用JS 还是举个例子,我 ...

  5. lua语言自学知识点----Lua与.Net相互调用

    知识点: LuaInterface作用是用来完成Lua与C#的相互调用. LuaInterface核心库:1.luainterface.dll 用于C#读取lua(放在bin目录同级) 2.luane ...

  6. C语言与汇编语言相互调用原理以及实例

    C语言与汇编语言相互调用原理以及实例 1.原理 其实不管是C语言还是汇编语言想要执行都是最终编译链接成为二进制文件. 这里一定要明确编译和链接是两个步骤,生成的文件格式也是不一样的. 编译生成的文件是 ...

  7. JS与原生OC/Swift相互调用总结

    代码地址如下:http://www.demodashi.com/demo/12754.html JS-OC-Swift JS和OC/Swift相互调用,主要总结了JS和OC交互的三种方式 1.使用UI ...

  8. 转载 OS js oc相互调用(JavaScriptCore) ---js调用iOS ---js里面直接调用方法

    OS js oc相互调用(JavaScriptCore)   接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用 ...

  9. 转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js

    iOS js oc相互调用(JavaScriptCore)   从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这 ...

随机推荐

  1. tr1

    tr echo 12345 | tr '0-9' '9876543210' echo 87654 | tr '9876543210' '0-9' ROT13 echo "tr came, t ...

  2. python:函数和循环判断

    输出显示 先说一下最基础的输出: print('hello world') 唯一值得提到是字符串的format函数. format函数代替了C中的%s. print('{0} say:{0} {1}. ...

  3. C语言之路-2-判断

    #include<stdio.h> int main() { ; printf("请输入"); scanf("%d",&a); ){ pri ...

  4. JVM--02

    Java虚拟机内存管理: 共享: 方法区:存储运行时常量池.已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据 java堆:存储对象实例 线程独占区: 虚拟机栈:存放方法运行时所需的 ...

  5. MVC中一般为什么用IQueryable而不是用IList?

    IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred execution)”,如果被加载的实体有关联实体(associations),此关联实 ...

  6. lua分割字符串

    str = "abc;123;345" local tab = string.split(str, ";") 然后list里面就是 abc123345 了.第二 ...

  7. c4b和c4f的区别

    1. cc.c4b的参数直接填rgba的值. 2 .cc.c4f(r,g,b,透明度),把rgb值填进去,会发现颜色不对,需要把rgb值除以255,所以最终转换公式是: cc.c3b(r,g,b) = ...

  8. Vuex数据可视化

    参考:https://gitee.com/hjm100/codes/46towe9v28a1bxfqhc7kl34 Vuex虽然能存储数据,但是一刷新就没有了,如果要实现数据持久化,就需要用vuex- ...

  9. Okhttp同步请求源码分析

    进阶android,OKhttp源码分析——同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的. 今天我们来分析一下OKhttp ...

  10. Sprite组件和Button组件的使用

    一.Sprint组件的使用 1.游戏中显示一张图片,通常我们称之为"精灵" sprite 2.cocos creator如果需要显示一个图片,那么需要在节点上挂一个精灵组件,为这个 ...