DllImport - DllNotFoundException android.so
DllImport - DllNotFoundException with android .so
这是我第一次尝试为 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();
};
SayHello.cpp :
#include "SayHello.h"
extern "C"
{
SayHello::SayHello(){}
SayHello::~SayHello(){}
char * SayHello::Hello()
{
return "Hello !";
}
}
然后我生成了一个文件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);
}
我完成了 this tutorial 中的所有步骤,但我有一个例外:
System.DllNotFoundException: libSayHello.so
我搜索过这个,但我一定是菜鸟,因为我没有找到任何东西。我应该如何使用我的 libSayHello.so
?
编辑:
我的 libSayHello.so
是用 7zip 看到的:
还有我的项目:
- 确认库已放在“/lib/{arch}/”文件夹中。
- 试试 [DllImport("SayHello")]。引擎可能会自动添加 "lib" 和“.so”。
我认为这 the best sample 适合你。
这一切都按照以下方案进行:
Android 支持 7 CPU 架构。
但 Xamarin 支持其中的 5 个。因此,在您的 Xamarin.Android 项目的设置中检查您将支持哪些架构:
[Xamarin.Droid.project]->[Properties]->[Android Options]->[Advanced]->[Supported architectures]
检查您的项目需要哪些架构。根据这个你的共享库应该为这些拱门编译。你应该把你的共享库放在 Xamarin.Droid.project 的文件夹 lib:
要在解决方案资源管理器中查看它们,您应该在 Xamarin.Android 项目的 .CSPROJ.
中提及它们
添加下一个项目组:
<ItemGroup>
<AndroidNativeLibrary Include="lib\{ARCH}\libCLib.so">
<Abi>{ARCH}</Abi>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</AndroidNativeLibrary>
</ItemGroup>
{ARCH} 可能是下一个:armeabi、armeabi-v7a、arm64-v8a, x86, x86_64.
现在您可以将 DllImport 放入您的代码中:
[DllImport("libCLib", EntryPoint = "clib_add")]
public static extern int Add(int left, int right);
我想你必须告诉入口点,因为没有这个语句我有运行时错误System.EntryPointNotFoundException.
并且不要忘记在您的代码中添加 next:
using System.Runtime.InteropServices;
这是我第一次尝试为 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();
};
SayHello.cpp :
#include "SayHello.h"
extern "C"
{
SayHello::SayHello(){}
SayHello::~SayHello(){}
char * SayHello::Hello()
{
return "Hello !";
}
}
然后我生成了一个文件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);
}
我完成了 this tutorial 中的所有步骤,但我有一个例外:
System.DllNotFoundException: libSayHello.so
我搜索过这个,但我一定是菜鸟,因为我没有找到任何东西。我应该如何使用我的 libSayHello.so
?
编辑:
我的 libSayHello.so
是用 7zip 看到的:
还有我的项目:
- 确认库已放在“/lib/{arch}/”文件夹中。
- 试试 [DllImport("SayHello")]。引擎可能会自动添加 "lib" 和“.so”。
我认为这 the best sample 适合你。
这一切都按照以下方案进行:
Android 支持 7 CPU 架构。
但 Xamarin 支持其中的 5 个。因此,在您的 Xamarin.Android 项目的设置中检查您将支持哪些架构:
[Xamarin.Droid.project]->[Properties]->[Android Options]->[Advanced]->[Supported architectures]
检查您的项目需要哪些架构。根据这个你的共享库应该为这些拱门编译。你应该把你的共享库放在 Xamarin.Droid.project 的文件夹 lib:
要在解决方案资源管理器中查看它们,您应该在 Xamarin.Android 项目的 .CSPROJ.
中提及它们添加下一个项目组:
<ItemGroup> <AndroidNativeLibrary Include="lib\{ARCH}\libCLib.so"> <Abi>{ARCH}</Abi> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </AndroidNativeLibrary> </ItemGroup>
{ARCH} 可能是下一个:armeabi、armeabi-v7a、arm64-v8a, x86, x86_64.
现在您可以将 DllImport 放入您的代码中:
[DllImport("libCLib", EntryPoint = "clib_add")] public static extern int Add(int left, int right);
我想你必须告诉入口点,因为没有这个语句我有运行时错误System.EntryPointNotFoundException.
并且不要忘记在您的代码中添加 next:
using System.Runtime.InteropServices;