この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン | |||
|
wiki:unity:tips:087 [2015/01/06 14:17] step |
— (現在) | ||
|---|---|---|---|
| ライン 1: | ライン 1: | ||
| - | ====== 087 ndk-buildで生成したライブラリを利用する ====== | ||
| - | |||
| - | ===== ライブラリの作成 ===== | ||
| - | * Visual Studio 2010を起動します。 | ||
| - | * ファイル -> 新規作成 -> プロジェクト と選択します。 | ||
| - | * Win32 コンソールアプリケーション を選択し、プロジェクト名を「DLLImport_VS」とします。 | ||
| - | * アプリケーションの種類をDLLにチェックを入れて、追加のオプションは「空のプロジェクト」に変えて完了します。 | ||
| - | * ソースファイルを追加します。(plugin.cpp/h) | ||
| - | <code c> | ||
| - | // plugin.h | ||
| - | extern "C" | ||
| - | { | ||
| - | int Hoge(); | ||
| - | } | ||
| - | </code> | ||
| - | |||
| - | <code c> | ||
| - | // plugin.cpp | ||
| - | #include "plugin.h" | ||
| - | |||
| - | int Hoge() | ||
| - | { | ||
| - | return 999; | ||
| - | } | ||
| - | </code> | ||
| - | |||
| - | ここで一度VisualStudioでビルドしてエラーが出ないか確認します。エラーが出なければAndroid用にndk-buildします。ndk-build用のAndroid.mk ファイルを用意します。 | ||
| - | |||
| - | <code> | ||
| - | include $(CLEAR_VARS) | ||
| - | |||
| - | # override strip command to strip all symbols from output library; no need to ship with those.. | ||
| - | cmd-strip = $(TOOLCHAIN_PREFIX)strip $1 | ||
| - | |||
| - | LOCAL_ARM_MODE := arm | ||
| - | LOCAL_PATH := $(NDK_PROJECT_PATH)/jni | ||
| - | LOCAL_MODULE := libjni | ||
| - | LOCAL_CFLAGS := -Werror | ||
| - | |||
| - | LOCAL_SRC_FILES := jni.cpp | ||
| - | LOCAL_SRC_FILES += ../plugin.cpp | ||
| - | |||
| - | LOCAL_LDLIBS := -llog | ||
| - | |||
| - | include $(BUILD_SHARED_LIBRARY) | ||
| - | </code> | ||
| - | plugin.cpp がlibjniに含まれる様にします。 | ||
| - | ndk-buildでエラーが出なければ.soファイルが生成されます。 | ||
| - | |||
| - | ===== Unity側にプラグインを呼び出すクラスを用意する ===== | ||
| - | * Unity を起動し、新規プロジェクトを作成します。名前はDLLImport とします。 | ||
| - | * Project のAssetsにPlugins -> Android フォルダを作成します。 | ||
| - | * Androidフォルダに、soファイルが含まれているlibsフォルダ毎ドラッグ&ドロップします。 | ||
| - | {{:wiki:unity:tips:unity_native_plugin_cpp_001.png?300|}} | ||
| - | |||
| - | |||
| - | * プラグインを利用するためのスクリプトをPluginsフォルダに追加します。 | ||
| - | |||
| - | <code csharp> | ||
| - | using UnityEngine; | ||
| - | using System.Collections; | ||
| - | using System.Runtime.InteropServices; | ||
| - | using System; | ||
| - | |||
| - | public class JNI | ||
| - | { | ||
| - | [DllImport ("jni")] public static extern int Hoge(); | ||
| - | } | ||
| - | </code> | ||
| - | これで呼び出せる様になりました。任意の場所からJNI.Hoge() とすれば999 と値が返ってきます。 | ||
| - | {{:wiki:unity:tips:unity_native_plugin_cpp_002.png?300|}} | ||
| - | |||
| - | |||
| - | 実行時にEntryPointNotFoundException エラーがが出てしまう場合は関数の実態を見つけられずにいます。例えば以下の場合は関数が見つけられずエラーが出ます。 | ||
| - | |||
| - | <code c> | ||
| - | extern "C" | ||
| - | { | ||
| - | static int Hoge(); | ||
| - | } | ||
| - | </code> | ||
| - | |||
| - | <code c> | ||
| - | #include "plugin.h" | ||
| - | static int Hoge() | ||
| - | { | ||
| - | return 999; | ||
| - | } | ||
| - | </code> | ||
| - | static 宣言が余計に付いてます。 | ||