DllImport - 带有android .so的DllNotFoundException

A.P*_*cat 5 c++ android shared-libraries visual-studio

这是我第一次尝试为Android/iOS创建库c ++.

我正在使用Visual Studio 2015 - Xamarin.

首先,我创建了一个项目:Visual C++ - >跨平台 - >共享库.在hared库中,我创建了2个文件.

SayHello.h:

#pragma once
#include <string.h>

class SayHello {
public:
    SayHello();
    ~SayHello();
    static char* Hello();
};
Run Code Online (Sandbox Code Playgroud)

SayHello.cpp:

#include "SayHello.h"
extern "C"
{
    SayHello::SayHello(){}

    SayHello::~SayHello(){}

    char * SayHello::Hello()
    {
        return "Hello !";
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我生成了一个文件libSayHello.so并用xamarin创建了一个Android项目来尝试调用函数hello.有我的MainActivity.cs:

[DllImport("libSayHello.so")]
static extern String Hello();

protected override void OnCreate(Bundle bundle)
{
    // I paste only my added code :
    String hello = Hello();
    Toast.MakeText(this.ApplicationContext, hello, ToastLength.Long);
}
Run Code Online (Sandbox Code Playgroud)

我完成了本教程中的所有步骤,但我有一个例外:

System.DllNotFoundException:libSayHello.so

我搜索了这个,但我一定是那么的菜鸟,因为我没找到任何东西.我应该如何使用我的libSayHello.so

编辑:

libSayHello.so见过7zip:

在此输入图像描述

我的项目:

在此输入图像描述

She*_*ikh 4

我认为这将是最适合您的示例。

这一切都按照以下方案进行:

  1. Android支持7种CPU架构。

    但 Xamarin 支持其中 5 个。因此,在 Xamarin.Android 项目的设置中检查您将支持哪些架构:

    [Xamarin.Droid.project]->[Properties]->[Android Options]->[Advanced]->[Supported architectures]

在此输入图像描述

检查您的项目需要哪些拱门。据此,您的共享库应该针对这些架构进行编译。您应该将共享库放在 Xamarin.Droid.project 的文件夹 lib 中:

在此输入图像描述

  1. 要在解决方案资源管理器中查看它们,您应该在 Xamarin.Android 项目的.CSPROJ中提及它们。

    添加下一个项目组:

    <ItemGroup> <AndroidNativeLibrary Include="lib\{ARCH}\libCLib.so"> <Abi>{ARCH}</Abi> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </AndroidNativeLibrary> </ItemGroup>

    {ARCH} 可能是下一个:armeabiarmeabi-v7aarm64-v8ax86x86_64

  2. 现在您可以将DllImport放入您的代码中:

    [DllImport("libCLib", EntryPoint = "clib_add")]
    public static extern int Add(int left, int right);
    
    Run Code Online (Sandbox Code Playgroud)

    我认为您必须讲述入口点,因为如果没有此语句System.EntryPointNotFoundException ,我会出现运行时错误。

    并且不要忘记在代码中添加 next :

    using System.Runtime.InteropServices;