首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin在将win32 DLL移植到安卓共享库方面会有所帮助吗?

Xamarin在将win32 DLL移植到安卓共享库方面会有所帮助吗?
EN

Stack Overflow用户
提问于 2013-10-23 10:42:12
回答 1查看 909关注 0票数 1

我正在从事一个项目,在这个项目中,我需要将NGSpice仿真库包括在一个安卓应用程序中,当然也可以使用它。

我需要将NGSpice windows移植到我的安卓应用程序中,扎马林将在多大程度上帮助我完成这个任务?这是一个win32 dll,它不是基于.Net的dll,请看一下NGSpice链接。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-23 10:58:57

是的,使用Android是可能的。

由于阅读所有的文档在一开始可能会有些压倒性,我将给您一个快速的参观。

  1. 安装NDK
  2. 在项目目录中创建一个名为jni的文件夹
  3. 在该文件夹中创建一个子文件夹lib,并将库中所需的源文件复制到该文件夹中。
  4. jni文件夹中创建两个文件,即wrapper.c和wrapper.h。这些文件应该包含本机库的高级包装器,适合于使用C#端使用DllImport进行绑定。
  5. jni文件夹中创建一个名为Android.mk的文件
  6. Application.mk jni文件夹中创建一个名为的文件
  7. 运行ndk-构建
  8. ndk成功完成后,在您的项目目录中创建子文件夹,并将生成的本机库(包括其周围的文件夹)复制到lib。您的文件夹结构应该如下所示: -> libs -> armeabi和x86 (这两个文件夹都包含一个特定于体系结构的.so文件)。通过建立此文件夹结构,我们确保MonoDroid将自动加载当前运行时体系结构的匹配库。
  9. 在您的C#项目中创建新的类文件Foo.cs。该类实现了本机库包装器与C#世界之间的绑定胶。
  10. 利润!

Android.mk:

代码语言:javascript
复制
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libFoo
LOCAL_SRC_FILES := wrapper.c lib/source1.c lib/sourcen.c

include $(BUILD_SHARED_LIBRARY)

注意:需要用实际库源文件的名称替换lib lib/source1.c和lib/sourcen.c。

Application.mk:

代码语言:javascript
复制
APP_ABI := armeabi armeabi-v7a x86

这一行告诉ndk-构建您希望支持的体系结构。x86是为模拟器设计的。

包装.h:

代码语言:javascript
复制
#pragma once

typedef struct _InternalState
{
    FILE *m_pFile;
} InternalState;

//////////////////////
// Public API

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

InternalState *FooCreate(int foo);
void FooDoStuff(InternalState *pState);

#ifdef __cplusplus
}
#endif /* __cplusplus */

包装器.c:

代码语言:javascript
复制
//////////////////////
// Public API

InternalState *FooCreate(int foo)
{
  // Initialize actual library here
  // return state if necessary
}

void FooDoStuff(InternalState *pState)
{
  // Call actual library here
}

Foo.cs:

代码语言:javascript
复制
public class Foo :
  IDisposable
{
  private IntPtr handle;
  private bool disposed;

  private Foo(IntPtr handle)
  {
    this.handle = handle;
  }

  ~Foo()
  {
    Dispose(false);
  }

  public void Dispose()
  {
    Dispose(true);
    GC.SuppressFinalize(this);
  }

  public void Dispose(bool disposing)
  {
    disposed = true;

    Close();
  }

  #region Native Imports

  [DllImport("libFoo")]
  private static extern IntPtr FooCreate(int seed);
  [DllImport("libFoo")]
  private static extern void FooDoStuff(IntPtr pHandle);

  #endregion

  private void VerifyHandle()
  {
    if (handle == IntPtr.Zero)
      throw new InvalidOperationException("Handle not initialized");
  }

  #region Public API

  public static Foo FromSeed(int seed)
  {
    IntPtr handle = FooCreate(seed);
    if(handle == IntPtr.Zero)
      throw new System.Exception("Failed to create native object");

    return new Foo(handle);
  }

  public void DoStuff()
  {
    VerifyHandle();

    FooDoStuff(handle);
  }

  #endregion
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19539456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档