ios swift 接入c++
2018-10-26 15:17:00 weixin_33836223 阅读数 109

Swift 与 C++混合编程的最佳实践
大型 App 由于跨平台的需要,底层一般会采用 C++来实现,当时再往上到应用层的话基本都会用对应平台的语言,比如 Windows 可能会用 C#,Android 用 Kotlin,iOS 用 Swift。

我这里主要想探讨一下 Swift 与 C++ 混合编程最佳实践。

由于 Swift 无法直接调用 C++,所以不得已需要引入一个中间层包装 C++代码。

目前实践过两种方法

C++ ==> Objective-C++ / Objective-C ==> Swift
C++ ==> C ==> Swift
第一种做法比较自然,也是苹果教的方法。

但是存在一个问题,因为 Objective-C 都是以面向对象为导向的,所以封装 C++代码时 就需要用对象方式 在 Objective-C 中 建立模型。但是我其实希望 Objective-C 这一层尽量的薄,我们应该把所有的模型建立在 Swift 这一层,这样才能让代码的可维护性更好。

这样 就引出 第二种方式,直接用 C 封装 C++,仅仅是最简单的封装导出,而所有的对象模型建立在 Swift 这一层。目前感觉这种方式是优于第一种方式的。

不知道各位还有其他更好的方法不?

摘自:https://www.v2ex.com/t/429752

2016-07-08 18:14:54 dengshuai_super 阅读数 2269

转自:http://www.cnblogs.com/yuyongjian/p/4361383.html?utm_source=tuicool&utm_medium=referral


一,C,C++, Objective-C,Swift有什么关系,还有什么是混编-.-?

1.当然是兄弟关系,虽然Objective-C是扩充C的面向对象编程语言,C++是在C语言的基础上开发的一种通用编程语言。Swift是由苹果公司推出有意让其与Objective-C共存于苹果公司操作系统上。但是Objective-C一直是由苹果公司来抚养,C,C++也因为苹果公司才变得如此流行。
2.混编,就是混合编译-.-强大吧,好好感受史蒂夫 乔布斯对开发技术人员的尊重和期待。
3.C,C++, Objective ,Swift 但就像《葫芦娃》里面七个兄弟中的四个一样牛掰,七葫芦娃是最厉害的,但需要七个兄弟齐心协力才能收妖。类似的,Swift是最小的弟弟,这就意味着Swift是最厉害的。我们在接近新宠Swift的同时,也要经常复习其他语言,不要忘记他的哥哥们。

二,小小的比较

1.Swift和Objective-C
我们都体会得到Swift调用Objective-C并不难,也不麻烦。你只要在swift的工程里创建OC的文件,系统就会提问帮你生成一个bridging-header,只要在这个bridging-header里import所有要用到的OC的头文件,就可以在swift文件里用swift的语言风格来调用OC类了。

2.Swift和C++
C++并不是像Objective-C这样。首先,我们应该想到Objective-C与C++是可以混编得perfect,而且可以使用STL,办法就是将OC的.m文件后缀改成.mm,然后在OC类中写一个wraper,然后在里面调用C++的类,封装成几个公共的方法就可以了。这时再用swift来调用wraper里的方法,就可以执行C++语句了。

三,iOS OC和Swift混编

1.创建一个swift或者oc的工程:我这里是创建的Swift语言的工程,工程名SwiftTest
2.在工程中代码目录下创建一个oc的类,选择oc语言, 会出一个对话框,选择YES

这里写图片描述

3.这时会在工程里看到下图这样一个头文件.

这里写图片描述

4.在这个头文件里添加你的OC文件的.h文件,就可以在任意swift文件中自行调用所包含的oc文件了。

这里写图片描述

5.接下来在工程的target-》build Setting->package下个性如下两项
6.然后在OC代码的.m文件中引入 + “-swift.h” 这样一个头文件,比如我的工程会生成 SwiftTest-swift.h这样一个头文件的。 然后你的.m文件就可以随便调用swift文件了。

这里写图片描述

其实如果你设置的Defines Module = YES了, xcode就会默认生成Product Module Name - swift.h这样一个头文件,这个头文件下会有你所有.swift文件的.h信息。

四,总结

1.Swift语言是苹果公司的利器。如果想靠iOS开发来养家人和女朋友,就得好好研究Swift,最好是去苹果官方网站学习,那里有Swift的下载资源和Swift博客,但苹果官方网站里的文档都是英文,所以英语得过关,这并不代表一定要过四六级,只要看得懂技术文档就行,毕竟六级不是人能看得懂的-.-
2.看十篇技术文档,不如解决一个问题,不如自己写一个Demo。所以程序员只能苦逼的奉献自己的青春,多写代码—>.->
3.单身狗要早点找女朋友:)

2017-09-30 11:37:50 oiken 阅读数 502

转载自: https://stackoverflow.com/questions/32541268/can-i-have-swift-objective-c-c-and-c-files-in-the-same-xcode-project/32546879#32546879

Can I have Swift, Objective-C, C and C++ files in the same Xcode project?




Can all 4 languages be used in the same project at all, and if so how?

There are similar questions in the flavor: Can I mix Swift with C++? Like the Objective - C .mm filesto which the accepted answer is no.

Using Bridging Header adequately, .h that do not contain C++ statements, Objective-Cwrappers when .h do contain C++.mm files to do the actual wrapping of C++ classes, and .swift, can the 4 languages (5 if you include Objective-C++) build and link into a single executable?


YES.

You can mix SwiftCC++Objective-C & Objective-C++ files in the same Xcode project.

C

// Declaration: C.h
#ifndef C_h
#define C_h
#ifdef __cplusplus
extern "C" {
#endif
    void hello_c(const char * name);
#ifdef __cplusplus
}
#endif
#endif /* C_h */

// Definition: C.c
#include "C.h"
#include <stdio.h>
void hello_c(const char * name) {
    printf("Hello %s in C\n", name);
}

C++

// Declaration: CPP.hpp
#pragma once
#include <string>
class CPP {
public:
    void hello_cpp(const std::string& name);
};

// Definition: CPP.cpp
#include "CPP.hpp"
#include <iostream>
using namespace std;
void CPP::hello_cpp(const std::string& name) {
    cout << "Hello " << name << " in C++" << endl;
}

Objective-C wrapper for C++

// Declaration: CPP-Wrapper.h
#import <Foundation/Foundation.h>
@interface CPP_Wrapper : NSObject
- (void)hello_cpp_wrapped:(NSString *)name;
@end

// Definition: CPP-Wrapper.mm
#import "CPP-Wrapper.h"
#include "CPP.hpp"
@implementation CPP_Wrapper
- (void)hello_cpp_wrapped:(NSString *)name {
    CPP cpp;
    cpp.hello_cpp([name cStringUsingEncoding:NSUTF8StringEncoding]);
}
@end

Objective-C

// Declaration: Objective-C.h
#import <Foundation/Foundation.h>
@interface Objective_C : NSObject
- (void)hello_objectiveC:(NSString *)name;
@end

// Definition: Objective-C.m
#import "Objective-C.h"
@implementation Objective_C
- (void)hello_objectiveC:(NSString*)name {
    printf("Hello %s in Objective-C\n", [name cStringUsingEncoding:NSUTF8StringEncoding]);
}
@end

Objective-C++

// Declaration: Objective-CPP.h
#import <Foundation/Foundation.h>
@interface Objective_CPP : NSObject
- (void)hello_objectiveCpp:(NSString *)name;
@end

// Definition: Objective-CPP.mm
#include <iostream>
#import "Objective-CPP.h"
using namespace std;
@implementation Objective_CPP
- (void)hello_objectiveCpp:(NSString *)name {
    cout << "Hello " << [name cStringUsingEncoding:NSUTF8StringEncoding] << " in Objective-C++\n";
}
@end

Swift

// Declaration & definition: Swift.swift
func hello_swift(_ name: String) {
    print("Hello \(name) in Swift")
}

Bridging-Header.h

Cannot import CPP.hpp header file, not because of it's naming convention, but because it contains the class keyword.

#import "C.h"
#import "CPP-Wrapper.h"
#import "Objective-C.h"
#import "Objective-CPP.h"

Invocation from Swift

// Invoke C
hello_c("World".cStringUsingEncoding(NSUTF8StringEncoding))

// Can't Invoke C++ without a wrapper
// CPP().hello_cpp("World".cStringUsingEncoding(NSUTF8StringEncoding))
// Invoke C++ through Objective-C
CPP_Wrapper().hello_cpp_wrapped("World")

// Invoke Objective-C
Objective_C().hello_objectiveC("World")

// Invoke Objective-C++
Objective_CPP().hello_objectiveCpp("World")

// Invoke Swift
Swift().hello_swift("World")

.h (Headers)

(See item 3 in this Stack Overflow answer)

.h: this is the tricky part, since they are ambiguously used for all flavors of C, ++ or not, Objective or not. When a .h does not contain a single C++ keyword, like class, it can be added to the ...Bridging-Header.h, and will expose whatever function the corresponding .c or .cpp functionalities it declares. Otherwise, that header must be wrapped in either a pure C or Objective-C API.

Output

Hello World in C
Hello World in C++
Hello World in Objective-C
Hello World in Objective-C++
Hello World in Swift

Comments

Cy-4AH:

Yes. You only need wrap C++ into C or Objective-C to use in Swift.

Tommy

Indeed, I have a project that does exactly that. C++ for the thrust of the abstract cross-platform model stuff with some C parts underneath; Objective-C to wrap the C++ classes for Swiftpurposes, Swift to bind all that to a subclass of NSDocument, with some custom views that interrogate the C stuff.

MaddTheSane

Added the extern "C" wrapper as per your excellent suggestion. To invoke the C method void hello_c(const char * name) from C++ method hello_cpp(const std::string& name), add #include "C.h" and call hello_c(name.c_str());.

Keith Adler

The new SO-32541268: Now with parameters!


2015-11-23 10:21:23 qinyuanpei 阅读数 12796

  各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。虽然Unity3D引擎依靠强大的跨平台能力睥睨高手林立的游戏引擎世界,我们在使用Unity3D游戏引擎的时候基本上不会去接触底层的东西,可是有时候面对某些奇葩的要求的时候,我们就不得不考虑使用C++这样的语言来为其编写相关的插件。你如果问我是什么样的奇葩要求,比如接入蓝牙手柄来控制游戏、接入类似街机的设备来控制游戏、接入同一个游戏到两个不同的设备上并响应不同的控制……诸如此类的种种问题,可能目前在Unity3D引擎中找不到解决方案,这个时候写C++插件就变成了一种刚性需求,这就是我们今天要来一起探讨的问题。

  Unity3D主要使用C#进行开发,所以为Unity3D编写插件本质上就是让C#调用C++代码。目前主要有C++ CLR和C++ Native两种实现方法,其中C++ CLR可以理解为运行在.Net CLR即公共语言运行库上的C++代码,这种代码是托管的C++代码,目前并没有被C++标准承认,因为它更像是C++和C#两种语言的混合代码,这种代码的优势是可以像普通的.NET库一样被C#调用,考虑到Unity3D建立在和.Net类似的Mono上,因此这种方式应该是我们的最佳实践方案;C++ Native则是指传统的C++ 动态链接库,通过DllImport在C#中进行包装后在C#中进行调用,相对地这种方式调用的是非托管的C++代码,这种方式相信接触过Windows开发的朋友应该不会感到陌生啦,它是一种更为普遍的方法,例如我们要接入苹果官方SDK的时候,需要对Object C的代码进行封装后交给C#去调用,而这里使用的方法就是DllImport了。

  好了,下面我们来看看两种方式各自是如何实现的吧!这里博主使用的开发环境是Windows 8.1 32bit 和 Visual Studio 2012,Unity3D的版本为4.6版本。

C++ CLR

创建一个C++ CLR类库项目

  首先我们按照下图中的步骤创建一个C++ CLR项目:

截图是件讨厌的事情,虽然懒惰的人们都喜欢

请注意.Net版本问题,重要的事情说三遍,不认真看这里的人出现问题就不要到我这里来评论了,我最讨厌连文章都没有看明白就来和你纠缠不清的人,谢谢。创建好项目后请打开项目属性窗口设置【公共语言运行时支持】节点的值为【安全 MSIL 公共语言运行时支持(/clr:safe)】好了,下面我们找到CLR4Unity.h文件,添加ExampleClass声明:

/// <summary>
/// 一个简单的托管C++示例类
/// </summary>
public  ref  class ExampleClass
{
    public:

    /// <summary>
    /// 产生一个介于min和max之间的整型随机数
    /// <returns>整型随机数</returns>
    /// <param name="min">最小值</param>
    /// <param name="max">最大值</param>
    /// </summary>
    static int  Random(int min,int max)
    {
        //注意在托管的C++中使用gcnew来代替new
        //我承认C++写CLR代码略显奇葩像是C++和C#语法的混合
        return (gcnew System::Random)->Next(min,max);
    }

    /// <summary>
    /// 计算一个整数的平方
    /// <returns>整型数值</returns>
    /// <param name="a">需要平方的数值</param>
    /// </summary>
    static int Square(int a)
    {
        return a * a;
    }

    /// <summary>
    /// 返回两个数中的最大值
    /// <returns>整型数值</returns>
    /// <param name="a">参数1</param>
    /// <param name="b">参数2</param>
    /// </summary>
    static int Max(int a,int b)
    {
        if(a<=b){
            return b;
        }else{
            return a;
        }
    }
};

显然我们这里定义了三个简单的方法,注意到第一个方法Random依赖于System.Rnadom类,而在托管的C++中是使用gcnew来代替new这个关键字的,所以请尽情感受C#和C++的混搭语法风格吧!这样我们就可以编译得到CLR4Unity.dll这个类库,将这个文件复制到Unity3D项目中的Plugins目录下下,然后将其加入项目引用列表。如果你以为引用就是:

using CLR4Unity;

呵呵,我严重怀疑你对.Net的熟悉程度。你没有添加对CLR4Unity.dll的引用,你到底在using什么啊?

先添加引用然后using

如果你对.NET熟悉到足以无视这里的一切,请闭上眼接着往下看,哈哈!

在C#中添加引用及方法调用

  接下来我们在Unity3D中创建一个脚本PluginTest.cs,然后在OnGUI方法增加下列代码。可是你要以为这些代码就应该写在OnGUI方法中,抱歉请你先去了解MonoBehaviour这个类。什么?添加了这些代码报错?没有using的请自行面壁:

//调用C++ CLR中的方法
if(GUILayout.Button("调用C++ CLR中的方法", GUILayout.Height (30))) 
{
    Debug.Log("调用C++ CLR中的方法Random(0,10):" + ExampleClass.Random(0,10));
    Debug.Log("调用C++ CLR中的方法Max(5,10):" + ExampleClass.Max(5,10));
    Debug.Log("调用C++ CLR中的方法Square(5):" + ExampleClass.Square(5));
}

C++ Native

创建一个C++动态链接库项目

  首先我们按照下图中的步骤来创建一个C++ Win32项目:

不要问我从哪里来

我的故乡在远方

好了,接下来我们找到Native4Unity.cpp写入下列代码:

// Native4Unity.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
//为了使用rand()函数引入C++标准库
#include "stdlib.h"

/// <summary>
/// 产生一个介于min和max之间的整型随机数
/// <returns>整型随机数</returns>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
/// </summary>
extern "C" __declspec(dllexport) int Random(int min,int max)
{
    return rand() % (max - min + 1) + min;
}

/// <summary>
/// 返回两个数中的最大值
/// <returns>整型数值</returns>
/// <param name="a">参数1</param>
/// <param name="b">参数2</param>
/// </summary>
extern "C" __declspec(dllexport) int Max(int a ,int b)
{
    if(a<=b){
       return b;
    }else{
       return a;
    }
}

/// <summary>
/// 计算一个整数的平方
/// <returns>整型数值</returns>
/// <param name="a">需要平方的数值</param>
/// </summary>
extern "C" __declspec(dllexport) int Square(int a)
{
    return a * a;
}

和C++ CLR类似,我们使用标准的C++语言来实现同样的功能。注意到rand()这个函数是C++标准库里的内容,所以我们在文件开头增加了对stdlib.h这个头文件的引用。这里需要注意的一点是:所有希望使用DllImport引入C#的C++方法都应该在方法声明中增加__declspec(dllexport)关键字,除非它在.def文件中对这些方法进行显示声明。关于.def文件的相关定义大家可以到MSDN上检索,这些都是属于C++编译器的内容,这里不再详细说了。

在C#中使用DllImport封装方法

  将编译好的Native4Unity.dll复制到Plugins目录中后,下面我们要做的事情就是在C#里对这些方法进行封装或者说是声明:

 [DllImport("Native4Unity")]
 private extern static int Random(int min, int max);

 [DllImport("Native4Unity")]
 private extern static int Max(int a, int b);

 [DllImport("Native4Unity")]
 private extern static int Square(int a);

然后就是简单地调用啦:

//调用C++ Native中的方法
if(GUILayout.Button("调用C++ Native中的方法", GUILayout.Height (30))) 
{
    Debug.Log("调用C++ Native中的方法Random(0,10):" + Random(0, 10));
    Debug.Log("调用C++ Native的方法Max(5,10):" + Max(5, 10));
    Debug.Log("调用C++ Native中的方法Square(5):" + Square(5));
}

最终程序的运行效果如图:

这个结果来之不易请大家珍惜

2019-03-07 19:48:37 chqj_163 阅读数 1725

各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。虽然Unity3D引擎依靠强大的跨平台能力睥睨高手林立的游戏引擎世界,我们在使用Unity3D游戏引擎的时候基本上不会去接触底层的东西,可是有时候面对某些奇葩的要求的时候,我们就不得不考虑使用C++这样的语言来为其编写相关的插件。你如果问我是什么样的奇葩要求,比如接入蓝牙手柄来控制游戏、接入类似街机的设备来控制游戏、接入同一个游戏到两个不同的设备上并响应不同的控制……诸如此类的种种问题,可能目前在Unity3D引擎中找不到解决方案,这个时候写C++插件就变成了一种刚性需求,这就是我们今天要来一起探讨的问题。
  Unity3D主要使用C#进行开发,所以为Unity3D编写插件本质上就是让C#调用C++代码。目前主要有C++ CLR和C++ Native两种实现方法,其中C++ CLR可以理解为运行在.Net CLR即公共语言运行库上的C++代码,这种代码是托管的C++代码,目前并没有被C++标准承认,因为它更像是C++和C#两种语言的混合代码,这种代码的优势是可以像普通的.NET库一样被C#调用,考虑到Unity3D建立在和.Net类似的Mono上,因此这种方式应该是我们的最佳实践方案;C++ Native则是指传统的C++ 动态链接库,通过DllImport在C#中进行包装后在C#中进行调用,相对地这种方式调用的是非托管的C++代码,这种方式相信接触过Windows开发的朋友应该不会感到陌生啦,它是一种更为普遍的方法,例如我们要接入苹果官方SDK的时候,需要对Object C的代码进行封装后交给C#去调用,而这里使用的方法就是DllImport了。
  好了,下面我们来看看两种方式各自是如何实现的吧!这里博主使用的开发环境是Windows 8.1 32bit 和 Visual Studio 2012,Unity3D的版本为4.6版本。

C++ CLR

创建一个C++ CLR类库项目

  首先我们按照下图中的步骤创建一个C++ CLR项目:

请注意.Net版本问题,重要的事情说三遍,不认真看这里的人出现问题就不要到我这里来评论了,我最讨厌连文章都没有看明白就来和你纠缠不清的人,谢谢。创建好项目后请打开项目属性窗口设置【公共语言运行时支持】节点的值为【安全 MSIL 公共语言运行时支持(/clr:safe)】好了,下面我们找到CLR4Unity.h文件,添加ExampleClass声明:
 

/// <summary>
/// 一个简单的托管C++示例类
/// </summary>
public  ref  class ExampleClass
{
    public:

    /// <summary>
    /// 产生一个介于min和max之间的整型随机数
    /// <returns>整型随机数</returns>
    /// <param name="min">最小值</param>
    /// <param name="max">最大值</param>
    /// </summary>
    static int  Random(int min,int max)
    {
        //注意在托管的C++中使用gcnew来代替new
        //我承认C++写CLR代码略显奇葩像是C++和C#语法的混合
        return (gcnew System::Random)->Next(min,max);
    }

    /// <summary>
    /// 计算一个整数的平方
    /// <returns>整型数值</returns>
    /// <param name="a">需要平方的数值</param>
    /// </summary>
    static int Square(int a)
    {
        return a * a;
    }

    /// <summary>
    /// 返回两个数中的最大值
    /// <returns>整型数值</returns>
    /// <param name="a">参数1</param>
    /// <param name="b">参数2</param>
    /// </summary>
    static int Max(int a,int b)
    {
        if(a<=b){
            return b;
        }else{
            return a;
        }
    }
};

 显然我们这里定义了三个简单的方法,注意到第一个方法Random依赖于System.Rnadom类,而在托管的C++中是使用gcnew来代替new这个关键字的,所以请尽情感受C#和C++的混搭语法风格吧!这样我们就可以编译得到CLR4Unity.dll这个类库,将这个文件复制到Unity3D项目中的Plugins目录下下,然后将其加入项目引用列表。如果你以为引用就是:
 

using CLR4Unity;

呵呵,我严重怀疑你对.Net的熟悉程度。你没有添加对CLR4Unity.dll的引用,你到底在using什么啊? 

如果你对.NET熟悉到足以无视这里的一切,请闭上眼接着往下看,哈哈!

在C#中添加引用及方法调用 

  接下来我们在Unity3D中创建一个脚本PluginTest.cs,然后在OnGUI方法增加下列代码。可是你要以为这些代码就应该写在OnGUI方法中,抱歉请你先去了解MonoBehaviour这个类。什么?添加了这些代码报错?没有using的请自行面壁:

//调用C++ CLR中的方法
if(GUILayout.Button("调用C++ CLR中的方法", GUILayout.Height (30))) 
{
    Debug.Log("调用C++ CLR中的方法Random(0,10):" + ExampleClass.Random(0,10));
    Debug.Log("调用C++ CLR中的方法Max(5,10):" + ExampleClass.Max(5,10));
    Debug.Log("调用C++ CLR中的方法Square(5):" + ExampleClass.Square(5));
}

C++ Native

创建一个C++动态链接库项目 

  首先我们按照下图中的步骤来创建一个C++ Win32项目:

好了,接下来我们找到Native4Unity.cpp写入下列代码:

// Native4Unity.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
//为了使用rand()函数引入C++标准库
#include "stdlib.h"

/// <summary>
/// 产生一个介于min和max之间的整型随机数
/// <returns>整型随机数</returns>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
/// </summary>
extern "C" __declspec(dllexport) int Random(int min,int max)
{
    return rand() % (max - min + 1) + min;
}

/// <summary>
/// 返回两个数中的最大值
/// <returns>整型数值</returns>
/// <param name="a">参数1</param>
/// <param name="b">参数2</param>
/// </summary>
extern "C" __declspec(dllexport) int Max(int a ,int b)
{
    if(a<=b){
       return b;
    }else{
       return a;
    }
}

/// <summary>
/// 计算一个整数的平方
/// <returns>整型数值</returns>
/// <param name="a">需要平方的数值</param>
/// </summary>
extern "C" __declspec(dllexport) int Square(int a)
{
    return a * a;
}

 和C++ CLR类似,我们使用标准的C++语言来实现同样的功能。注意到rand()这个函数是C++标准库里的内容,所以我们在文件开头增加了对stdlib.h这个头文件的引用。这里需要注意的一点是:所有希望使用DllImport引入C#的C++方法都应该在方法声明中增加__declspec(dllexport)关键字,除非它在.def文件中对这些方法进行显示声明。关于.def文件的相关定义大家可以到MSDN上检索,这些都是属于C++编译器的内容,这里不再详细说了。

在C#中使用DllImport封装方法

  将编译好的Native4Unity.dll复制到Plugins目录中后,下面我们要做的事情就是在C#里对这些方法进行封装或者说是声明:

[DllImport("Native4Unity")] 
private extern static int Random(int min, int max); 

[DllImport("Native4Unity")] 
private extern static int Max(int a, int b); 

[DllImport("Native4Unity")] 
private extern static int Square(int a);

然后就是简单地调用啦:

//调用C++ Native中的方法 
if(GUILayout.Button("调用C++ Native中的方法", GUILayout.Height (30))) 
{ 
    Debug.Log("调用C++ Native中的方法Random(0,10):" + Random(0, 10)); 
    Debug.Log("调用C++ Native的方法Max(5,10):" + Max(5, 10)); 
    Debug.Log("调用C++ Native中的方法Square(5):" + Square(5)); 
}

最终程序的运行效果如图: 

 

---------------------
作者:PayneQin
来源:CSDN
原文:https://blog.csdn.net/qinyuanpei/article/details/49991627
版权声明:本文为博主原创文章,转载请附上博文链接!

支付宝开放平台C++方式接入

阅读数 18011

https://github.com/ArthasModern/AlipayOpenapiCpp该项目为C++项目,包含访问支付宝开放平台(Openapi)网关的源码;/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**/工程中有两个项目文件:Openapi.pro为QtCreate

博文 来自: sowhat_Ah

支付宝无线支付服务端接入C++

阅读数 3335

做类似第三方接入这种事情,所能够参考的比较有价值的资料就是文档和demo,如果它们描述地足够清晰,那接入起来当然是件非常容易的事情。相对来说,阿里提供的文档和demo都比较清晰。在这之前我也做过其他的第三方接入,一次是官方文档和给的demo对不上,对接的时候还得找官方的接入人员咨询,非常蛋疼,对接成功后上线了一段时间又发现了问题,原来对方又把接口给改了,返回数据都跟以前的不一致,我艹~~

博文 来自: u013040181

iOS Framework混淆/编译打包脚本(支持swift/oc/c++)

阅读数 20

本文将介绍iOS代码混淆及编译的自动化脚本方案,支持swift、m、c、cpp和h文件类型的混淆,使用编译时混淆的策略,不影响源码阅读,只需在想要混淆的函数名或者变量名前加个private_即可,可通过函数实现安全混淆、去混淆、混淆再编译。Demo传送门⚠️声明请将该脚本放在Xcode的Project工程的根目录。当前版本未配置完整Xcode环境...

博文 来自: weixin_34127717

C++函数指针和Swift的函数对象

阅读数 15

C++函数指针和Swift的函数对象在C++中学习函数指针式非常痛苦的事情,而在Swift里面学习函数指针则是非常愉快的。基本语法一个函数的声明由函数名,参数列表,返回值三个部分组成,在实际应用中,函数本身也可以当作参数,这个时候就是函数指针,函数指针赋予C语言一定的动态能力,C++的很多的功能都是通过函数指针来实现的,不可谓不重要,在Swift等函...

博文 来自: weixin_33849215

Swift、OC、C++混合编程

阅读数 199

OC调用C++:   1、创建oc工程:       2.主要步骤:将某个.m文件后缀改为.mm,    3.创建c++文件 #ifndef__Test__CPPHello__#define__Test__CPPHello__#includeclassCPPHello{public:

博文 来自: GuiLehan
没有更多推荐了,返回首页