Unity使⽤NDK在Android平台上引⽤C++代码的so⽂件(下)由于最近进⼊了公司,⼿头上的⼯作需要⼀点⼀点的去适应,所以没有空来完成接下来的博⽂,今天突然想到写⼀些,发现这么久没有接触了,好像已经忘记了很多,写下这个博⽂,我也正好回顾⼀个这⼀⽅⾯的知识。
关于在unity上使⽤C++的代码需要⽤到SO⽂件了,这就像Cocos上使⽤C++编写的游戏⼀样可以运⾏在Android上也同样是使⽤了so⽂件。
⾸先在Android上使⽤so⽂件我们分为下⾯⼏个步骤:
⼀、NDK环境的搭建
NDK环境的搭建⾮常简单,只需在⽹上下载⼀个NDK的环境安装上就可以,安装好以后会有很多的例⼦,这⾥你也可以参考⼀下,不想看的,在第⼆部分我会⽤⼀个最简单的例⼦带你编译成⼀个简单的so⽂件,这可以增强⾃⼰的成就感和增加兴趣去往下继续摸索,到现在为⽌,你只需要安装好⼀个NDK的环境就可以跟我进⼊下⼀步的操作,最好呢把NDk加⼊环境变量中⽅⾯⼀点。
⼆、so⽂件的编译
⾸先选择⼀个你需要编译so⽂件的专⽤⽂件夹,最好是英⽂路径,没试过中⽂路径可以不可以(你可以试试),接下来,在你选的那个⽂件夹下创建⼀个名为“jni”的⽂件夹,如下图:
打开这个jni⽂件夹,我们要创建三个⽂件:Android.mk 、Application.mk 、testdll.cpp,最后⼀个⽂件是你要编译的C++⽂件,名字你也可以⾃⼰取,不过第⼀个⽂件中要注意你要编译的这个⽂件名字。
Android.mk⽂件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := testdll
LOCAL_SRC_FILES := testdll.cpp
include $(BUILD_SHARED_LIBRARY)
⾸先看上⾯的的module变量和files变量是你要编译个导出的模块名字和⽂件的名字,改成你需要的⽂件名和模块名字,最好要⼀样,这样好便于管理和维护,其他的可以先按照我这样写
Application.mk⽂件
APP_ABI := all
APP_STL := stlport_static
⼀个⾏是⽤于导出成什么⽂件的选项,这⾥我写的是ALL,表⽰导出所有的类型,后⾯你可以⾃⼰选择,第⼆⾏⼀定要加上,这个是⽤于添加静态的C/C++头⽂件的,不加的话,后⾯编译带有头⽂件的代码会有不到头⽂件的报错。
unity 教程
testdll.cpp⽂件
extern
{
static int ReturnNum()
{
return 32;
}
}
这是我写的测试⽤的最简单的C++⽂件,⽤于返回⼀个数字。记住如果是C++的代码⼀定要使⽤extern包起来,否则so引⽤的函数表中不到这个函数,这是很重要的。测试使⽤就应该先使⽤最简单有效的东西,如果想写复杂的再慢慢往下探索,这样便于出问题的所在。
好了,⼀切都准备好了,我们开始编译⽂件
打开命令⾏,在这⾥,如果你添加了环境变量就只需要⽤命令⾏打开到你创建的jni的⽂件夹下,没有配环境变量的紧接着往下看,如图:
然后敲⼊ndk-build命令静静等待⽚刻,成功后是如下图这样:
可以看到创建出了适⽤于不同平台的so⽂件,这些⽂件在你创建的⽂件夹下的libs⽂件夹下,并⽤放在不同平台使⽤的⽂件夹,这样so⽂件就被编译好了,提⽰⼀下,android下使⽤的so⽂件暂时使⽤armebi-v7a平台,这个是32位的android,在所有的android上都可以使⽤的,⽽v8a只可以在较新的设备上运⾏,你可以先⽤v7a测试看看。
如果你的ndk环境变量没有配置好,使⽤下⾯这个⽅法,
打开命令⾏,同样打开到你创建的jni⽂件夹下⾯,如图:
但是,接下来的命令你需要加⼊你的ndk的绝对路径
⽐如:D:\Android\NDK-r10e\ndk-build 这是我的ndk路径,回车后如下图:
同样完成了操作。
三、放到Unity的环境下
我们把编译好的v7a的so⽂件放到上⼀节我们创建好的unity项⽬中的Assets\Plugins\Android\libs⽬录下,下⾯我们就可以在unity⾥调⽤so⽂件中的⽅法了
四、在unity下的C#代码⾥如何引⽤C++代码制作成的so⽂件
上⼀节的test.cs脚本⾥⽤下⾯的⽅法去调⽤,注意下⾯代码中我把上⼀节的代码删除掉了,可以不删除的,你们应该可以理解的
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Runtime.InteropServices;
using UnityEngine.UI;
public class test : MonoBehaviour {
public Text txt;
[DllImport("testdll")]
public static extern int ReturnNum();
void Start()
{
< = ReturnNum().ToString();
}
}
接下来我们打包成apk在模拟器⾥运⾏⼀下看⼀看
之前做教程的时候忘记加extern,最后没有成功,加了extern以后就没有任何问题了,运⾏的代码可能和上⾯的有区别,你应该懂得,但调⽤的地⽅没有任何区别,如果有任何疑问可以给我留⾔

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。