在Unity中调用Native dll,需要通过PInvoke的方式
详细的操作步骤可以参考
https://zhuanlan.zhihu.com/p/30746354
遇到的问题
1、EntryPointNotFoundException
下载最新的 Dependency Walker 用来进行查看我们生成的dll里面的函数签名。
dll里面的函数签名
因为在C++中存在函数的重载,允许函数重名,因此在编译器生成dll的时候,为了区别重名的程序,会将其进行一定算法进行名称转换。
解决办法:
(1)添加EntryPoint参数
添加EntryPoint参数
(2)在VS项目中添加一个def文件
添加def文件
def文件的内容:
LIBRARY
EXPORTS
Add
在链接器选项中选中使用的def文件
在链接器选项中选中使用的def文件
指定def文件后,函数名称不会进行转换
指定def文件后的函数名称
2、在MacOS中使用Unity进行调试
(1)DllNotFoundException
在iOS中,插件被静态链接到可执行文件中,所以我们必须使用__Internal作为库名。
https://docs.unity3d.com/Manual/NativePlugins.html
(2)EntryPointNotFoundException
Native dll不能在macOS中使用,需要将C++代码放在Xcode中生成.bundle文件使用。
Unity具有跨平台特性,所以一般使用C++分为四种情况:
平台 | 库文件 |
---|---|
Windows | .dll |
MacOS | .bundle |
Android | .so |
iOS | .a |
库文件的生成和使用,可以参考
https://www.cnblogs.com/garsonlab/p/9992144.html
值得参考的实例:
https://github.com/Unity-Technologies/NativeRenderingPlugin.git
网友评论