Unity调用c++动态链接库注意事项

Unity通过ndk调用javajava通过jni调用c++ .so

1:Jni的.so是独立的,还是依赖其他.so库或静态库?

答:都可以,但具体的.so拷贝到unity中后,是否还能正常调用,有待测试。

 

2:C++中jni与java回调函数,这里只举例静态函数调用


先保存回调函数的引用,具体的返回格式请查看jni文档

再调用函数


对应到java中的函数如下:

Unity调用c++动态链接库注意事项_第1张图片


3:C++中jni与java是否可回调参数?

答:可以,具体方式请查看jni文档

 

4:java传递参数到c++,c++中需要注意转换:



Unity发布到安卓上,直接调用.so库:


1:.so是独立的,还是依赖其他.so库或静态库?

答:必须是独立的,当然打包时可以依赖于任何库,但最终输出的只能是一个整体库,多依赖的方式暂时未测试成功。

 

2:c++结构函数的书写方式:



3:c#传递字符串到c++可以这样写:


对应到c++中可以这样写:



4:c++是否可以返回字符串?

答:可以

C++需要这样写:


对应到c#端需要这样写:

Unity调用c++动态链接库注意事项_第2张图片

5:c++是否可以使用回调函数

答:可以

 

C#需要这样写:


对应到c++里这样写:




6:c++是否可以使用回调参数

答:可以, c#需要传递指针给c++,要再非安全模式下


Unity发布到windows上,直接调用.dll


1:.dll是独立的,还是依赖其他.dll库或静态库?

答:都可以,如果是依赖其他动态库,则被依赖的dll也要拷贝到unity下

 

2:c++结构函数的书写方式:

函数前要接


3:c#传递字符串的时候应该这样写:


对应到c++里应该是这样的



4:是否可以返回字符串?

答:可以,需要这样写:

Unity调用c++动态链接库注意事项_第3张图片


5:c++是否可以使用回调函数?

答:可以

C#对应的回调函数应该这样写:


ReckonContourCallback是一个委托

对应到c++里应该这样写:




6:c++是否可以使用回调参数?

答:可以

C#的回调参数需要这样写:


编辑器需要设置打开安全模式开关,并且函数前增加unsafe标志,采用指针作为回调手段,另外传入的指针参数必须是unsafe下的fixed的,要固定住堆中内存。

对应到c++里应该这样写:



注意事项:

另外需要注意的一些坑是,如果dll本身依赖了其他dll,这时需要把被依赖的dll也拷贝到Unity的Assets/Plugins下,但是Unity4.x可能会不好使,5.x正常,原因未知

 

在把打包好的.so库拷贝到Assets/Plugins下时需要注意,AndroidStudio可能一次打出多种平台的.so,但我们只能一次拷贝一个到Unity的Assets/Plugins下,否则会报库名重复冲突错误。

 

经过测试,在5.x下运行正常的.so到了4.x中可能会不正常,原因未知。

 

.so拷贝到Unity5.x的Assets/Plugins下后,需要设置其目标平台为你手机的cpu架构:

Unity调用c++动态链接库注意事项_第4张图片

否则可能运行不正常。

 

Unity正常是不允许非安全模式代码的,否则会出现编译错误,不能运行,此时需要在Assets目录下创建一个文本文件,名称为gmcs内容如下:


并且重启编辑器,方可解决。

 

另外不推荐c#调用java再由java调用c++的方式,除非必要。不推荐多个动态链接库相互依赖的方式,即使可以运行

 

如果需要动态链接库(dll,.so)可以读取到sd卡上的文件,则在导出工程时需要配置如下:

Unity调用c++动态链接库注意事项_第5张图片

C#端如果想传递路径给动态链接库读取sd卡内容,格式是这样的:



你可能感兴趣的:(Unity开发工具)