私は、Android アプリケーションに NGSpice シミュレーション ライブラリを含め、もちろんそれを使用できるようにする必要があるプロジェクトに取り組んでいます。
NGSpice Windows DLL を Android アプリケーションに移植する必要がありますが、xamarinはこのタスクでどの程度役立ちますか? これは win32 dll であり、.Net ベースの dll ではありません。NGSpiceリンクをご覧ください。
ありがとう。
はい、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 は、実際のライブラリ ソース ファイルの名前に置き換える必要があります。
アプリケーション.mk:
APP_ABI := armeabi armeabi-v7a x86
この行は、サポートしたいアーキテクチャを ndk-build に伝えます。x86 は Intel Android HAXM Simulator 用です。
ラッパー.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
}