// plugin.h extern "C" { int Hoge(); }
// plugin.cpp #include "plugin.h" int Hoge() { return 999; }
ここで一度VisualStudioでビルドしてエラーが出ないか確認します。エラーが出なければAndroid用にndk-buildします。ndk-build用のAndroid.mk ファイルを用意します。
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)
plugin.cpp がlibjniに含まれる様にします。 ndk-buildでエラーが出なければ.soファイルが生成されます。
using UnityEngine; using System.Collections; using System.Runtime.InteropServices; using System; public class JNI { [DllImport ("jni")] public static extern int Hoge(); }
これで呼び出せる様になりました。任意の場所からJNI.Hoge() とすれば999 と値が返ってきます。
実行時にEntryPointNotFoundException エラーがが出てしまう場合は関数の実態を見つけられずにいます。例えば以下の場合は関数が見つけられずエラーが出ます。
extern "C" { static int Hoge(); }
#include "plugin.h" static int Hoge() { return 999; }
static 宣言が余計に付いてます。