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