UnityとC++ライブラリ間の値の受け渡し

Unity(C#)でライブラリ(C++)を使用したいときの簡単なプログラムを書きます。
やりたいことは以下のとおり
1.「Androidアプリ」から「ライブラリ(soファイル)」を呼び出す
2.「UnityEditor」から「ライブラリ(dllファイル)」を呼び出す


Eclipse(+AndroidNDK)でsoライブラリを
VisualC++でdllライブラリを作成してます。

<Eclipseでsoライブラリの作成>
参考URL
Android NDKを使った開発環境の構築


1.ライブラリのコードを書く
ソース NativeCode.cpp
※extern "C" が必要です

#include <stdio.h>

extern "C" char * NativeCode(int a, char * b)
{
static char str[100];
sprintf(str, "param from Unity is %d and %s", a, b);
return str;
}

2.Android.mkを書く
※ライブラリの名前の頭には「lib」が必要です
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := libNativeAndroid
LOCAL_SRC_FILES := NativeCode.cpp

include $(BUILD_SHARED_LIBRARY)

3.Application.mkを書く
※CPUは「armeabi」と「x86」に対応させました
APP_OPTIM        := release
APP_ABI := armeabi x86
APP_PLATFORM := android-8

4.ビルドしてライブラリを作成する

5.Unityにライブラリを配置して、ライブラリの属性を設定する
Assets/Plugins/Android/libs/armeabi-v7a/ライブラリ
Assets/Plugins/Android/libs/x86/ライブラリ
※フォルダ名に注意してください「armeabi-v7a」と「x86」です
ネイティブ連携00
ネイティブ連携01

<VisualC++でdllライブラリの作成>
参考URL
Unity and DLLs: C#(managed) and C++(unmanaged)


1.ライブラリのコードを書く
※extern "C" が必要です

ヘッダ NativeCode.h
#ifdef TESTFUNCDLL_EXPORT
#define TESTFUNCDLL_API __declspec(dllexport)
#else
#define TESTFUNCDLL_API __declspec(dllimport)
#endif

extern "C" {
TESTFUNCDLL_API char * NativeCode(int a, char * b);
}

ソース NativeCode.cpp
#include "NativeCode.h"
#include <stdio.h>

extern "C" {
char * NativeCode(int a, char * b)
{
static char str[100];
sprintf(str, "param from Unity is %d and %s", a, b);
return str;
}
}

2.ビルドしてライブラリを作成する
※Windowsが64bitの場合、64bitでビルドする必要があります
ネイティブ連携02

3.Unityにライブラリを配置して、ライブラリの属性を設定する
Assets/Plugins/ライブラリ
ネイティブ連携03

<Unityでライブラリを呼び出すコードを作成>
※AndroidのDllImportに注意してください。ライブラリ名から「lib」を除く必要があります
※文字列の受け渡しには、IntPtrとMarshal関数を使用しています
using UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices;

public class CallNativeCode : MonoBehaviour {

#if UNITY_ANDROID && !UNITY_EDITOR
[DllImport("NativeAndroid", EntryPoint="NativeCode")]
private static extern IntPtr CallNativeAndroid(int a, IntPtr b);
#else
[DllImport("NativeWindows", EntryPoint="NativeCode")]
private static extern IntPtr CallNativeWindows(int a, IntPtr b);
#endif

void Start () {
string str1 = "abc";
IntPtr ptr1 = Marshal.StringToHGlobalAnsi(str1);
#if UNITY_ANDROID && !UNITY_EDITOR
IntPtr ptr2 = CallNativeAndroid(1, ptr1);
#else
IntPtr ptr2 = CallNativeWindows(1, ptr1);
#endif
string str2 = Marshal.PtrToStringAnsi(ptr2);
print ("ライブラリの戻り値は:" + str2);

Marshal.FreeHGlobal(ptr1);
}
}

<実行ログ>
UnityEditor
ネイティブ連携04
スマホ
ネイティブ連携05

ライブラリが見つからない系のエラーが出る場合は、上記青字部分を確認してみてください

関連記事
[タグ] ネイティブ連携

コメント

非公開コメント

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。