我正在开发一个项目,我需要在Android应用程序中包含NGSpice模拟库,当然也可以使用它。
我需要将NGSpice windows DLL移植到我的Android应用程序,xamarin在这个任务中会帮助我多远?它是一个win32 dll,它不是基于.Net的dll,请查看NGSpice链接
感谢。
答案 0 :(得分:1)
是的,可以使用Android NDK。
由于一开始阅读所有文档可能有点压倒性,我会给你一个快速浏览。
<强> Android.mk:强>
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 / source1.c和lib / sourcen.c需要替换为实际库源文件的名称。
<强> Application.mk:强>
APP_ABI := armeabi armeabi-v7a x86
此行告诉ndk-build您希望支持哪些体系结构。 x86适用于Intel Android HAXM Simulator。
<强> wrapper.h:强>
#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 */
<强> wrapper.c:强>
//////////////////////
// Public API
InternalState *FooCreate(int foo)
{
// Initialize actual library here
// return state if necessary
}
void FooDoStuff(InternalState *pState)
{
// Call actual library here
}
<强> Foo.cs:强>
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
}