Android上的DllNotFoundException

时间:2017-05-17 14:28:52

标签: android unity3d

我试图在Unity中加载共享库。它适用于Windows /编辑器,但不适用于Android,无论我做什么或用于库,我总是得到DllNotFoundException。

我正在使用lib.so文件,这些文件适用于32BIT ARM EABIS,因此跨平台编译似乎成功。

我的lib.so文件位于Assets/Plugins/Android/libs/armeabis-v7a/文件夹中。

我为DllImport尝试了不同的语法(假设lib名为Plugin,文件为Plugin.dll和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文件夹中。

我用于测试的智能手机是带有armv8处理器的OnPlus3。

有人设法在Android上成功加载共享本机库吗?关于我做错了什么的任何想法?

谢谢

编辑:

插件代码可以在这里找到:https://github.com/FFmpeg/FFmpeg

C#代码可以在这里找到:https://github.com/Ruslan-B/FFmpeg.AutoGen/blob/7e001dde3acaad70ed188b75e686f23574f81388/FFmpeg.AutoGen/FFmpegInvoke.cs

在Unity项目中添加FFmpegInvoke.cs或生成FFmpeg.Autogen.dll并将其添加到项目中会产生相同的结果(dll只会使Unity项目更快构建)。

1 个答案:

答案 0 :(得分:1)

我注意到你做错了几件事:

  

我的lib.so文件位于Asset / Plugins / libs / armeabis-v7a /文件夹中。

应该是:

Assets/Plugins/Android/libs/armeabi-v7a

如果您拥有该插件的x86架构版本,则应将它们放在:

Assets/Plugins/Android/libs/x86
  

我为DllImport尝试了不同的语法(假设调用了lib   插件,文件Plugin.dll和libPlugin.so):

这些都不正确。如果插件文件名是“libPlugin.so”,则应使用“Plugin”作为名称。

  • 不要包含lib前缀。
  • 请勿包含“.so”后缀。

同样,如果插件名称是“libVideoPlayer.so”,则必须使用“VideoPlayer”。删除“lib”和“.so”。没有别的办法。

最后一点请注意,对于Android C ++插件,您无需导出插件。例如,DLLExport __declspec(dllexport)不是必需的。

虽然,您必须将函数名称放在“extern "C"