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中使用就能夠了。得意

相關文章
相關標籤/搜索