トップページ > 記事閲覧
Unity(Android)からの呼び出し方
日時: 2017/10/24 03:23
名前: 石田

質問させてください。
UnityからAquesTalk10を呼び出そうとしています。

Windowsではdllを問題なく呼び出せたのですが、
Androidからのsoの呼び出しが、色々と試してみたものの行うことが出来ません。
どなたか呼び出し方が分かる方はいらっしゃいますでしょうか?

また、ライブラリ側での.soファイルのUnity呼び出し対応予定などはありませんでしょうか?
メンテ

Page: 1 |

Re: Unity(Android)からの呼び出し方 ( No.1 )
日時: 2017/10/24 17:14
名前: 管理人

UnityのAndroid環境にて、一般的なso(共有ライブラリ)の呼び出しという話ではなく、AquesTalkのsoだと呼び出せないということでしょうか。
Unityを使ったことがないのですが、他の呼び出し可能なsoと、AquesTalkとの違いに、なにかお気づきの点があったら教えてください。
また、呼び出せないのは、ビルド時でなく、実行時の話なのでしょうか? 呼び出せないとは、呼び出し時にエラーが出るということでしょうか?
メンテ
Re: Unity(Android)からの呼び出し方 ( No.2 )
日時: 2017/10/25 02:51
名前: 石田

迅速な返答ありがとうございます。
諸々情報がおよび知識が不足しておりましてすいません。

>他の呼び出し可能なsoと、AquesTalkとの違いに、なにかお気づきの点があったら教えてください。
参考になるか分かりませんが、こちらにUnity公式が用意した
ネイティブプラグインの動作参考例があり、
https://docs.unity3d.com/ja/current/Manual/AndroidNativePlugins.html
プラグイン制作のサンプルがページ下部にあります。
パッケージがUnityの独自形式なので、以下に共有ライブラリをビルドするための構成ファイル
(Android.mk、Application.mk、NativeCode.c、build_plugin.sh)と、その内容を
文面の末尾に記述します。

上記で作成されたと思われる同梱のNativeCode.soはUnityから呼び出すことが出来ました。



>また、呼び出せないのは、ビルド時でなく、実行時の話なのでしょうか?
>呼び出せないとは、呼び出し時にエラーが出るということでしょうか?
ビルドは問題なく出来ます。呼び出しも関数に届いてはいるようなのですが
アプリが即落ちてしまいます。


エントリポイントの指定として「syntheWav」では関数名が見つからず、
soファイルをバイナリエディタで開くことで見つかった
Java_aquestalk_AquesTalk_syntheWav
と指定することで一応呼び出されたようで、アプリが落ちました。


syntheWav関数が処理的に動作しないのかと思い、
Java_aquestalk_AquesTalk_setDevKey
Java_aquestalk_AquesTalk_setUsrKey
も適当な引数で呼び出しましたが、同様にアプリが落ちました。

以下、アプリが落ちた瞬間のlogcat内容です。

10-25 02:05:34.569 2149-2171/? W/linker: libAquesTalk.so: unused DT entry: type 0x6ffffffe arg 0xe78
10-25 02:05:34.569 2149-2171/? W/linker: libAquesTalk.so: unused DT entry: type 0x6fffffff arg 0x1

--------- beginning of crash
10-25 02:05:34.743 2149-2171/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xa326 in tid 2171 (UnityMain)
10-25 02:05:34.743 2149-2171/? I/libc: Suppressing debuggerd output because prctl(PR_GET_DUMPABLE)==0

--------- beginning of system
10-25 02:05:34.785 977-1793/? W/ActivityManager: getRunningAppProcesses: caller 10153 does not hold REAL_GET_TASKS; limiting output
10-25 02:05:34.797 977-2353/? I/WindowState: WIN DEATH: Window{d86f13 u0 com.isdf/com.unity3d.player.UnityPlayerActivity}


何か参考になりましたら幸いです。
長文失礼いたしました。


以下共有ライブラリ構成ファイルです。
(BBSの禁止文字に引っかかったので、一部全角文字を使用しています。)

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)
LOCAL_MODULE := libnative
LOCAL_CFLAGS := -Werror
LOCAL_SRC_FILES := NativeCode.c
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)
---

Application.mk
---
APP_OPTIM := release
APP_ABI := armeabi
APP_PLATFORM := android-8
APP_BUILD_SCRIPT := Android.mk
---


NativeCode.c
---
float add(float x ,float y)
{
return x + y;
}
---

build_plugin.sh
---
♯!/bin/sh
echo ””
echo ”Compiling NativeCode.c...”
$ANDROID_NDK_ROOT/ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk $*
mv libs/armeabi/libnative.so ..

echo ””
echo ”Cleaning up / removing build folders...” #optional..
rm -rf libs
rm -rf obj

echo ””
echo ”Done!”

---
メンテ
Re: Unity(Android)からの呼び出し方 ( No.3 )
日時: 2017/10/25 08:00
名前: 管理人

詳細情報ありがとうございます。
おかげ様で、Unityの共有ライブラリのアクセスについて理解できました。

Java_aquestalk_AquesTalk_syntheWav()は、引数、戻り値共にJavaのオブジェクトになっています。
そのため、UnityからCのインターフェースで呼び出しても動かないと考えます。

念のため、AquesTalk10 AndroidのlibAquesTalk.soに、Cのインターフェースが残っていないか確認しましたが、すべて隠されていました。
ただ、Windows版と同様のCの関数インターフェースを出すことも技術的には可能です。
もし、興味がございましたら当社の問い合わせ先に直接メールください。
メンテ
Re: Unity(Android)からの呼び出し方 ( No.4 )
日時: 2017/10/26 02:04
名前: 石田

ご回答ありがとうございます。
早速サポートページの方からメールをさせていただきました。
メンテ
Re: Unity(Android)からの呼び出し方 ( No.5 )
日時: 2017/10/27 08:44
名前: 管理人

Cの関数エントリポイントを追加した、AquesTalk10 Android V.1.0.1を公開しました。
これで、Unityからも使用できるようになりました。
石田さん、ご協力ありがとうございました。
メンテ
Re: Unity(Android)からの呼び出し方 ( No.6 )
日時: 2017/10/27 10:15
名前: 石田
参照: https://qiita.com/ishidafuu/items/79581034ef81be062d0f

迅速な対応ありがとうございました。

qiitaの方にも記事を投稿させていただきました。
今後、利用される方の参考になれば幸いです。
メンテ

Page: 1 |

題名 スレッドをトップへソート
名前
URL
パスワード (記事メンテ時に使用)
コメント
CAPTCHA captcha画像 ←英数字を入力

   クッキー保存