この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン | |||
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 宣言が余計に付いてます。 |