Unity中使用c++

Unity具备跨平台特性,因此通常如果要使用c++分为四种状况:Windows、Android、MacOS以及IOS,对应使用生成的库文件后缀分别为”.dll”、”.so”、”.bundle”、”.a”;linux

 

一、  库文件生成android

1.1  DLLios

在Windows下生成dll的方式很是简单,通常来讲,对咱们这种写代码的来讲都会安装vs,直接在vs中新建相应的类库,而后添加你须要的cpp文件和头文件便可。我试了此种方法,可是用vs生成的会包含一些我不须要的头文件等,而我又相似于有洁癖,不想在我须要的代码以外看见其余的,而且,我懒得去除0.0 因此换了一种生成方式——CMake。c++

度娘了一下使用方法,各类分文件夹、各类list文件,一阵头疼。我须要编译的文件很少,也就五六个“cpp”,六七个“.h”,因此直接放在了一个文件夹下。层级为:安全

 

Root——bin //放置生成dll
         |— build//放置cmake生成的工程
         |— lib//放置源码
                  |—|—CmakeLists.txt
         |— CMakeLists.txt

 

Root下CMakeLists.txt的写法:函数

cmake_minimum_required(VERSION3.0) PROJECT (Your_Project_Name) ADD_SUBDIRECTORY(lib)

 

         第一行版本,第二行设置本身的工程名,第三行加入lib。工具

Lib下CmakeLists.txt的写法:ui

 

set(PROJECT_NAME" Your_Project_Name ") SET(SRC     ****.cpp#多个cpp文件按此方式写     ****.cpp     ****.cpp)     ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC}) #想获得动态库,参数就是SHARED     install (      TARGETS ${PROJECT_NAME}      DESTINATION"../bin"      )

 

接着,打开提早安装的cmake工具(cmake-gui),选择Source Code为Root, binaries选择build,点击左下角Configure按钮,若是出现“CMAKE_INSTALL_PREFIX”最好仍是选择Root吧,而后,选择左下角的Generate按钮,Done完以后在build文件夹下用VS打开一个“vcxproj”文件,右键在相应的项目上生成就能够获得DLL。spa

         1.2 SO指针

         .so文件用于安卓上,因此咱们使用Android NDK来编译。在Windows上编译个人环境为ndk+Cygwin,亲自在虚拟机Linux上只须要下载相应的ndk便可。具体的安装配置步骤找度娘便可。

         NDK编译首先须要编写Android.mk文件,具体编写为

 

LOCAL_PATH:= $(call my-dir)
 
    include $(CLEAR_VARS)
 
    LOCAL_MODULE    := Your_Project_Name
    LOCAL_SRC_FILES := \
    ****.cpp \
    ****.cpp \
    ****.cpp \
    ****.cpp
 
    APP_STL := stlport_static
    include $(BUILD_SHARED_LIBRARY)

 

         以上指令只看名字也能猜出大概的意思,把全部源文件和mk文件放在一个文件夹下,下一步就是直接编译了,先切换到指定的目录,CygWin执行指令:$NDK_ROOT/ndk-build,结果并非我所须要的,提示为:No Such File or Directy #include<vector>

         由于个人源文件用了系统的类库,可是在此并没找到,Google说要加上一句

 

APP_STL :=stlport_static

 

然并卵!又试了N中网上盛传的解决方案都没卵用。而后我就看看ndk自带的demo,模仿着又在文件夹下添加了一个Application.mk

 

APP_PLATFORM := android-9
APP_ABI := all
APP_STL := stlport_static

 

         还有因为不少安全限制,许多函数的接口上,必须用“const”修饰,通常你在vs上是不会报错的…在此会提示:Error: No much function for call ****

         __int64在linux下也会有问题,要改为相应的。

         ………一大堆vs下没有的bug来袭…………..

         而后,没有而后了,就是执行成功了,恭喜你得到.so文件一个。

(另,在linux下,源文件必须放在小写的jni目录下,不然不识别,我也不造为何0.0)

 

         1.3 bundle

         复制你使用ndk时修改的那一大堆在Windows下不会报错但Android下一大波bug的源文件到你的mac下,使用XCode新建一个MacOS下的bundle项目,代码添加进去,直接build便可。

       1.4 a

         使用方式同bundle,在iOS下选择 Cocoa TouchStatic Library 新建,而后拷贝代码,执行,得到.a。

  1.5 注

另,导出dll时, 在要导出的头文件下首先添加

 

#pragma once
#define DllExport  extern "C" __declspec( dllexport )//宏定义,

而后, 在须要导出的类或方法前,添加 DLLExport,相似:

 

 

DllExport MyClass * NewMyClass(); //导出一个方法


 而在除了dll的其余导出上, 不须要以上的定义, 而是在须要导出的类或函数先后作以下的定义写法

 

 

#pragma once
#ifdef __cplusplus
extern "C" {
#endif

//要导出的函数或类

#ifdef __cplusplus
}
#endif



 

 

二、  使用

在Unity中建立文件夹“Plugins”,

 2.1直接把把dll扔进去便可,或者建立个“x86_64”的文件夹装dll。

         2.2在该文件夹下建立Android/Libs,把生成的armeabi-v7a和x86两个文件夹拷贝进来便可。

         2.3在该文件夹下建立IOS文件夹,把.a放进去

         2.4bundle文件同dll同样处理

        

         2.5代码

 

conststringDLL_NAME="*****"; //android和ios下类库前会自动加lib的,但此处咱们用的是不写的 [DllImport(DLL_NAME)] publicstaticexternIntPtrMethord();//IntPtr用来接收指针 [DllImport(DLL_NAME)] publicstaticexternintM1(IntPtrpath); [DllImport(DLL_NAME)] publicstaticexternvoidM2(IntPtrpath, intmask=0x01);

 

 

导出使用全都相似这样。接着你只须要直接在unity中使用就能够了。得意