oT2
oT2

Reputation: 73

DllNotFoundException on Android

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.

I am using lib.so files, those are for 32BIT ARM EABIS, so the cross platform compilation seems to succeed.

my lib.so files are in the Assets/Plugins/Android/libs/armeabis-v7a/ folder.

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.

If I open the .apk with winrar, libs are in the libs/armeabis-v7a folder.

The smartphone I use for my tests is an OnPlus3 with a armv8 processor.

Anyone managed to sucessfuly load a shared native library on Android ? Any ideas about what I'm doing wrong ?

Thank you

EDIT:

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

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).

Upvotes: 2

Views: 7215

Answers (1)

Programmer
Programmer

Reputation: 125245

I noticed few things you are doing wrong:

my lib.so files are in the Asset/Plugins/libs/armeabis-v7a/ folder.

That should be at:

Assets/Plugins/Android/libs/armeabi-v7a

If you have the x86 architecture version of the plugin,you should place them at:

Assets/Plugins/Android/libs/x86

I tried different syntax for DllImport (assuming the lib is called Plugin, and the files Plugin.dll and libPlugin.so) :

None of those are correct. If the plugin file name is "libPlugin.so", you should use "Plugin" as the name.

  • Do not include the lib prefix.
  • Do not include the ".so" postfix.

Again, if the plugin name is "libVideoPlayer.so", you have to use "VideoPlayer". The "lib" and ".so" are removed. Nothing else will work.

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.

Although, you must put the function name inside "extern "C""

Upvotes: 2

Related Questions