4

I have written a chess library in C++ and I have compiled it for Windows (32-bit and 64-bit) and Android (x86 and armebi-v7).

My Windows build works completely correct, But when I build it for Android and when I run the game, I receive the following exception on my adb logcat -s Unity :

11-23 16:39:37.278 22335 22352 I Unity   : DllNotFoundException: MatinChess
11-23 16:39:37.278 22335 22352 I Unity   :   at (wrapper managed-to-native) MatinChess.Net.ExternMethods:Initialize ()
11-23 16:39:37.278 22335 22352 I Unity   :   at MatinChess.Net.MatinChess..ctor () [0x00000] in <filename unknown>:0
11-23 16:39:37.278 22335 22352 I Unity   :   at Model.Awake () [0x00000] in <filename unknown>:0

And when I unzip my apk file I have:

lib
|_ armeabi-v7a
|  |_ libmain.so
|  |_ libMatinChess.so
|  |_ libmono.so
|  |_ libunity.so
|_ x86
   |_ libmain.so
   |_ libMatinChess.so
   |_ libmono.so
   |_ libunity.so

Here are my settings and scripts:

Based on here and here, I have created Plugins folder in my Assets and placed my libraries like this:

Plugins
|_ Android
|  |_ libs
|     |_ armeabi-v7a
|     |  |_ libMatinChess.so
|     |_ x86
|        |_ libMatinChess.so
|_ x64
|  |_ MatinChess.dll
|_ x86
   |_ MatinChess.dll

And I got sure that the Platform Settings in my Inspector is configured correctly.

I have used my library in my scripts and based on here and here, instead of using libMatinChess.so for Android, I have not used lib at the beggining and .so at the end. So it is like this:

class ExternMethods
{
#if UNITY_ANDROID
    const string dll = "MatinChess";
#else
    const string dll = "MatinChess.dll";
#endif

    [DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
    public extern static PlayState CheckState();

    [DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
    public extern static void Initialize();

    //
    // other extern methods
    //
}

So when I build my Unity game for Windows, it works correctly. In order to make it work in Editor, I have followed this link and I have written the folowing script:

public class Model : MonoBehaviour
{    
    void Awake()
    {
#if UNITY_EDITOR_32
        var dllPath = Application.dataPath + Path.DirectorySeparatorChar + "Plugins" + Path.DirectorySeparatorChar + "x32";
#elif UNITY_EDITOR_64
        var dllPath = Application.dataPath + Path.DirectorySeparatorChar + "Plugins" + Path.DirectorySeparatorChar + "x64";
#else // Player
        var dllPath = Application.dataPath + Path.DirectorySeparatorChar + "Plugins";
#endif
        var currentPath = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process);
        if (currentPath != null && currentPath.Contains(dllPath) == false)
            Environment.SetEnvironmentVariable("PATH", currentPath + Path.PathSeparator + dllPath, EnvironmentVariableTarget.Process);
    }
}

So it works on Unity Editor as well.

Community
  • 1
  • 1
Matin Lotfaliee
  • 1,745
  • 2
  • 21
  • 43

2 Answers2

0

The method MatinChess.Net.ExternMethods.Initialize may be called before Environment.SetEnvironmentVariable("PATH",...), which leads to a DllNotFoundException.

Try printing a log message before you call MatinChess.Net.ExternMethods.Initialize and Environment.SetEnvironmentVariable. Then you can inspect the calling order of these methods.

Add if that's the cause, moving Environment.SetEnvironmentVariable("PATH",...) to the static initializer of MatinChess.Net.ExternMethods can possibly solve your problem.

Edit:
Try printing the PATH after you setting it, the method may failed to set it.

Edit:
Just a guess.. the android shared lib searching path should be LD_LIBRARY_PATH instead of PATH. Try setting that instead. I'm not sure if Unity3D has handled this.

Edit:
Not including all the library dependencies aside your libMatinChess.so is a possible cause. Some infomation here.

The above are all I can think of now.

Community
  • 1
  • 1
zwcloud
  • 4,546
  • 3
  • 40
  • 69
0

Check that you are actually exporting a valid .so file with the proper symbols.

Also check that you have included all library dependencies of your libMatinChess.so which may include your C runtime at times. Try linking statically with the standard library.

CustodianSigma
  • 738
  • 9
  • 19