Android上的DllNotFoundException
我正在尝试在Unity中加载共享库.它可以在Windows/Editor上运行,但不能在Android上运行,无论我做什么或用于库,我总是会收到DllNotFoundException.
I'm trying to load shared libraries in Unity. It works on Windows/Editor but not on Android, whatever I do or use for libraries I always get the DllNotFoundException.
我正在使用lib.so文件,这些文件用于32BIT ARM EABIS,因此跨平台编译似乎可以成功.
I am using lib.so files, those are for 32BIT ARM EABIS, so the cross platform compilation seems to succeed.
我的lib.so文件位于Assets/Plugins/Android/libs/armeabis-v7a/
文件夹中.
my lib.so files are in the Assets/Plugins/Android/libs/armeabis-v7a/
folder.
我为DllImport尝试了不同的语法(假设lib称为Plugin,文件Plugin.dll和libPlugin.so):
I tried different syntax for DllImport (assuming the lib is called Plugin, and the files Plugin.dll and libPlugin.so) :
[DllImport("Plugin")] => works for Windows only
[DllImport("libPlugin.so")] => obviously wont work for Windows, but doesn't work for Android either.
如果我使用winrar打开.apk,则libs在libs/armeabis-v7a
文件夹中.
If I open the .apk with winrar, libs are in the libs/armeabis-v7a
folder.
我用于测试的智能手机是带有armv8处理器的OnPlus3.
The smartphone I use for my tests is an OnPlus3 with a armv8 processor.
有人成功在Android上成功加载了共享的本机库吗?关于我在做什么错的任何想法吗?
Anyone managed to sucessfuly load a shared native library on Android ? Any ideas about what I'm doing wrong ?
谢谢
插件代码可以在这里找到: https://github.com/FFmpeg/FFmpeg
plugin code can be found here : https://github.com/FFmpeg/FFmpeg
C# code can be found here : https://github.com/Ruslan-B/FFmpeg.AutoGen/blob/7e001dde3acaad70ed188b75e686f23574f81388/FFmpeg.AutoGen/FFmpegInvoke.cs
在Unity项目中添加FFmpegInvoke.cs或生成FFmpeg.Autogen.dll并将其添加到项目中都会得到相同的结果(dll只会使Unity项目的构建速度更快).
Adding FFmpegInvoke.cs in the Unity Project or generating the FFmpeg.Autogen.dll and adding it to the project gives the same result (dll just makes the Unity Project faster to build).
我注意到您做错了几件事:
I noticed few things you are doing wrong:
我的lib.so文件位于Asset/Plugins/libs/armeabis-v7a/文件夹中.
my lib.so files are in the Asset/Plugins/libs/armeabis-v7a/ folder.
应该在:
Assets/Plugins/Android/libs/armeabi-v7a
如果您具有x86架构版本的插件,则应将其放在以下位置:
If you have the x86 architecture version of the plugin,you should place them at:
Assets/Plugins/Android/libs/x86
我为DllImport尝试了不同的语法(假设lib被调用了) 插件,以及文件Plugin.dll和libPlugin.so):
I tried different syntax for DllImport (assuming the lib is called Plugin, and the files Plugin.dll and libPlugin.so) :
这些都不是正确的.如果插件文件名为"libPlugin.so" ,则应使用"Plugin" 作为名称.
None of those are correct. If the plugin file name is "libPlugin.so", you should use "Plugin" as the name.
- 请勿包含lib前缀.
- 不包括".so"后缀.
同样,如果插件名称为"libVideoPlayer.so" ,则必须使用"VideoPlayer" . "lib"和".so"被删除.别的都行不通.
Again, if the plugin name is "libVideoPlayer.so", you have to use "VideoPlayer". The "lib" and ".so" are removed. Nothing else will work.
最后一个注意事项是,对于Android C ++插件,您无需导出该插件.例如,不需要DLLExport __declspec(dllexport)
.
One final note for you, for Android C++ plugin, you do not need to export the plugin. For example, DLLExport __declspec(dllexport)
is not necessary.
尽管如此,您必须将函数名称放在"extern "C"
"内
Although, you must put the function name inside "extern "C"
"